一、概述
上一篇介绍了基本的函数和结构类型,这里就可以开始写服务端和客户端通信小程序了,通信的基本的流程如下:
如果服务端使用Listen
来监听,那么可以不用ResolveTCPAddr
函数。
现在我们就来写一个server和client,实现功能:client发送数据到server,server将数据转成大写后返回。
二、服务端实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package main import ( "net" "fmt" "strings" ) func main(){ tcpAddr, err := net.ResolveTCPAddr("tcp4", "localhost:8080") //创建一个TCPAddr if err != nil{ fmt.Println(err) return } tcpLinstener, err := net.ListenTCP("tcp4", tcpAddr) //开始监听 if err != nil{ fmt.Println(err) return } fmt.Printf("Start listen:[%s] ", tcpAddr) tcpCoon, err := tcpLinstener.AcceptTCP() //阻塞,等待客户端连接 if err != nil{ fmt.Println(err) return } defer tcpCoon.Close() //记得关闭连接对象 data := make([]byte, 2048) n, err := tcpCoon.Read(data) //客户端连接后,开始读取数据 if err != nil{ fmt.Println(err) return } recvStr := string(data[:n]) fmt.Println("Recv:", recvStr) tcpCoon.Write([]byte(strings.ToUpper(recvStr))) //转换成大写后返回客户端 } |
开启服务端,进入监听状态等待客户端连接:
三、客户端实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
package main import ( "net" "fmt" ) func main(){ tcpAddr, err := net.ResolveTCPAddr("tcp4", "localhost:8080") //TCP连接地址 if err != nil{ fmt.Println(err) return } tcpCoon, err := net.DialTCP("tcp4", nil, tcpAddr) //建立连接 if err != nil{ fmt.Println(err) return } defer tcpCoon.Close() //关闭 sendData := "helloworld" n, err := tcpCoon.Write([]byte(sendData)) //发送数据 if err != nil{ fmt.Println(err) return } fmt.Printf("Send %d byte data success: %s ", n, sendData) recvData := make([]byte, 2048) n, err = tcpCoon.Read(recvData) //读取数据 if err != nil{ fmt.Println(err) return } recvStr := string(recvData[:n]) fmt.Printf("Response data: %s", recvStr) |
运行客户端,服务端将会响应客户端请求:
服务端状态如下:
至此,一个完成的server和clinet就完成了
评论