只是初步完成了客户端对服务端的连接,并返回数据,暂时没有做点对点,多对多的聊天,完后会做补充
server.go
package main import ( "net" "fmt" "strings" "io" "time" ) //处理数据 func chuli(conn net.Conn) { //结束后关闭连接 defer conn.Close() //当前连接的地址 address := conn.RemoteAddr().String() fmt.Printf("[%s]:%s\n", address, "连接成功") s := make([]byte, 2048) for { //读取数据 n, err2 := conn.Read(s) if err2 != nil && err2 != io.EOF { fmt.Println("错误2:", err2) return } else if err2 == io.EOF { time.Sleep(time.Second) break } //exit的时候退出 if string(s[:n-1]) == "exit" { conn.Write([]byte("exit")) fmt.Printf("[%s]:%s\n", address, "退出连接") return } fmt.Println("Client数据是:", string(s[:n-1])) //写入数据(给用户返回数据) conn.Write([]byte("你连接成功了,你刚才问我:" + strings.ToUpper(string(s[:n-1])))) } } func main() { //监听端口 ln, err := net.Listen("tcp", ":8080") defer ln.Close() if err != nil { fmt.Println("你有错误:", err.Error()) } for { //通信实现和等待下一个呼叫 conn, err1 := ln.Accept() if err1 != nil { fmt.Println("你有错误1:", err1.Error()) continue } go chuli(conn) } }
client.go
package main import ( "net" "fmt" "os" ) func main() { //建立链接 conn, err := net.Dial("tcp", "127.0.0.1:8080") if err != nil { fmt.Println("你得连接有错误:", err.Error()) } defer conn.Close() str := make([]byte, 2048) s := make([]byte, 2048) for { //获取键盘的输入内容 fmt.Printf("[%s]", "请输入内容:") n, err3 := os.Stdin.Read(str) if err3 != nil { fmt.Println("数据写入错误:", err3) } //写入数据 _, err1 := conn.Write([]byte(str[:n])) if err1 != nil { fmt.Println("发送失败", err1.Error()) } //接收数据 nn, err2 := conn.Read(s) if string(s[:nn]) == "exit" { fmt.Println("退出成功") return } if err2 != nil { fmt.Println("接收失败:", err2.Error()) } fmt.Println("client:", string(s[:nn])) } }
客户端展示:
服务端展示: