Go语言 之Socket并发的C/S模型通信
服务端:
package main import ( "fmt" "net" ) func DoHandler(conn net.Conn) { defer conn.Close() //读取数据 fmt.Println("开始读取数据") b := make([]byte, 1024) for { n, err := conn.Read(b) if err != nil { fmt.Println(err.Error()) return } fmt.Println(conn.RemoteAddr().String() + ": 读到的数据为" + string(b[:n])) } } func main() { listen, err := net.Listen("tcp", ":8000") if err != nil { fmt.Println(err.Error()) return } defer listen.Close() //循环 for { //阻塞等待客户端连接 conn, err := listen.Accept() if err != nil { fmt.Println(err.Error()) return } //创建协程处理逻辑 go DoHandler(conn) } }
客户端:
package main import ( "fmt" "net" "os" ) func main() { //创建客户端 listen, err := net.Dial("tcp", ":8000") if err != nil { fmt.Println(err.Error()) return } defer listen.Close() go func() { //获取重建盘输入的数据 str := make([]byte, 2048) for { n, err := os.Stdin.Read(str) if err != nil { fmt.Println(err.Error()) } //发送到服务端 _, err1 := listen.Write(str[:n]) if err1 != nil { fmt.Println(err.Error()) } } }() buf := make([]byte, 2048) for { //读取数据 n, err := listen.Read(buf) if err != nil { fmt.Println(err.Error()) } fmt.Println("读到的数据:" + string(buf[:n])) } }