Go服务端消息接收和发送
书香水墨 人气:0一. 服务端接收数据并返回数据
服务端代码
package main import ( "net" "fmt" ) func main() { //创建TCPAddress变量,指定协议tcp4,监听本机8899端口 addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899") //监听TCPAddress设定的地址 lis, _ := net.ListenTCP("tcp4", addr) fmt.Println("服务器已启动") //阻塞式等待客户端消息,返回连接对象,用于接收客户端消息或向客户端发送消息 conn, _ := lis.Accept() //把数据读取到切片中 b := make([]byte, 256) fmt.Println("read之前") //客户端没有发送数据且客户端对象没有关闭,Read()将会阻塞,一旦接收到数据就不阻塞 count, _ := conn.Read(b) fmt.Println("接收到的数据:", string(b[:count])) /* 向客户端发送数据 */ conn.Write([]byte("这是服务器传递的数据")) //关闭连接 conn.Close() fmt.Println("服务器结束") }
客户端代码
package main import ( "net" "fmt" ) func main() { //服务器端ip和端口 addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899") //申请连接客户端 conn, _ := net.DialTCP("tcp4", nil, addr) //向服务端发送数据 count, _ := conn.Write([]byte("客户端传递的数据")) fmt.Println("客户端向服务端发送的数据量为:", count) /* 接收服务器传递回来的数据 */ b := make([]byte, 256) c, _ := conn.Read(b) fmt.Println(string(b[:c])) 关闭连接 conn.Close() fmt.Println("客户端结束") }
可以在服务端添加循环,不停接收客户端发送来的数据,服务端代码修改如下
package main import ( "net" "fmt" ) func main() { addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899") lis, _ := net.ListenTCP("tcp4", addr) fmt.Println("服务器已启动") /* 服务器端添加死循环,不停的接收客户端对象 */ for { conn, _ := lis.Accept() b := make([]byte, 256) count, _ := conn.Read(b) nc := string(b[:count]) fmt.Println("接收到的数据:", nc) conn.Write([]byte("服务器:" + nc)) conn.Close() } fmt.Println("服务器结束") }
客户端代码修改如下
package main import ( "net" "fmt" "strconv" ) func main() { //服务器端ip和端口 addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899") //通过循环,模拟发送五次客户端请求 for i := 1; i <= 5; i++ { conn, _ := net.DialTCP("tcp4", nil, addr) conn.Write([]byte("客户端数据" + strconv.Itoa(i))) b := make([]byte, 256) c, _ := conn.Read(b) fmt.Println("第", i, "次服务器返回的数据:", string(b[:c])) conn.Close() } fmt.Println("客户端结束") }
三.并发访问
上面代码的问题是服务器获取到客户端对象后,如果客户端什么也没有输入,其他客户端无法连接.可以通过结合goroutine完成并发访问
只需要修改server.go,在里面添加goroutine
package main import ( "net" "fmt" ) func main() { addr, _ := net.ResolveTCPAddr("tcp4", "localhost:8899") lis, _ := net.ListenTCP("tcp4", addr) fmt.Println("服务器已启动") /* 服务器端添加死循环,不停的接收客户端对象 */ for { conn, _ := lis.Accept() go func() { //在此处添加创建go func()即可 b := make([]byte, 256) count, _ := conn.Read(b) nc := string(b[:count]) fmt.Println("接收到的数据:", nc) conn.Write([]byte("服务器:" + nc)) conn.Close() }() } fmt.Println("服务器结束") }
加载全部内容