创作人 Leo
编辑时间 Wed Jan 1,2020 at 09:28
与网络相关的类型在 net 包中
读取网络数据需要用到 io 、bufio 包
建立TCP服务器
func (socket *Socket) connect() {
// 创建一个TCP地址
tcpAddr := &net.TCPAddr{IP:net.ParseIP(socket.host), Port:socket.port, Zone:"IPv4"}
// 监听TCP
server,err := net.ListenTCP("tcp", tcpAddr)
// 设置最终必须关闭Server地址监听
defer server.Close()
utils.CheckErr(err)
// 循环接收客户端连接
for ; ; {
tcpConn,err := server.AcceptTCP()
utils.CheckErr(err)
// 当有客户端连接,启动一个协程进行通信
go socket.clientHandle(tcpConn)
}
}
服务器的建立过程与其他语言(java、c)类似,但是过程更简单了
申请socket描述符
监听ip和端口
接收客户端连接
使用协程可以很方便的进行多客户端通信任务,如果需要与主进程同步数据,可以使用 channel 处理
TCP客户端连接
func (client *Client) connect() {
// Dial函数可以方便的连接到一个服务器
conn,err := net.Dial("tcp", fmt.Sprintf("%s:%d", (*client).host, (*client).port))
defer client.close(conn)
...
}
客户端相对简单,net.Dial 封装了多个网络请求的详细操作,包括 tcp、udp、icmp、http 等
数据读取
func (socket *Socket) readFully(conn net.Conn) ([]byte, error) {
//ReadString 读取数据,直到遇到第一个 delim 字符为止
data,err := bufio.NewReader(conn).ReadString('\n')
utils.CheckErr(err)
return bytes.NewBufferString(data).Bytes(),nil
}
这里以一个Echo服务器为例,以 \n 为分隔符
ReadString 函数会在读取到的第一个 处将数据返回,返回的是带有 \n 的字符串类型
可以使用 Strings.TrimSpace 函数去除
完整代码:https://github.com/phpxin/godemos 中socket包