golang练习之聊天室——基本通信

本文分享了使用Golang实现网络服务的实践经验,通过构建聊天室应用熟悉基本API,探讨了接口与指针调用的问题,并采用one-goroutine-per-connection模型处理连接。

今天开始练习用golang写网络服务了,首先就拿聊天室来练手吧。

先试试基本的通信,熟悉一下基本的API。

server端代码:

package main

import (
	"github.com/apex/log"
	"net"
)

//我靠,为什么不能用指针调用接口,这是什么骚设计?
//func handleOneClient(client *net.Conn) {
func handleOneClient(client net.Conn) {
        defer client.Close()
	buf := make([]byte, 1024)
	nbytes, err := client.Read(buf)

	if err != nil {
		return
	}
	log.Info(string(buf[:nbytes]))
}

func main() {
	listener,err := net.Listen("tcp4", "127.0.0.1:54321")
	if err != nil {
		return
	}
	for {
		oneClient, err := listener.Accept()
		if err != nil {
			continue
		}

		go handleOneClient(oneClient)
	}
}

写服务端代码的时候,让我感到困惑的是,写handleOneClient函数的时候,我一开始设计参数类型是*net.Conn,然后在函数内部发现这货居然无法调用函数!!!

然后我就查看了一下net.Conn定义,发现它是一个Interface。

这是不是一个规则,就是类型是Interface的时候,不要设计成Interface的指针,直接使用Interface,否则不能调用其函数。但为什么就不能调用其函数,这一点我没搞懂。

这里采用了one-goroutine-per-connetion的模型。

client代码:

package main

import "net"

func main() {
	conn, err := net.Dial("tcp4", "127.0.0.1:54321")
	if err != nil {
		return
	}
	defer conn.Close()
	_, err = conn.Write([]byte("hello world"))
	if err != nil {
		return
	}
}

客户端就没什么好说的,太简单了。

(全文万)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值