简单TCP服务器和TCP客户端源码(Golang)
以下代码为服务端,非最终版代码,服务端可以接受多个客户端的请求,且所有消息会显示在服务端上,服务端无法发送消息:
package main import ( "fmt" "net" ) // HandleConn 是一个协程,并发处理请求,读取用户输入。 func HandleConn(conn net.Conn) { address := conn.RemoteAddr().String() fmt.Println("接收到请求,来中:", address) conn.Write([]byte(conn.RemoteAddr().String() + "加入聊天室。")) buf := make([]byte, 1024) for { n, err := conn.Read(buf) if err != nil { fmt.Println("err", err) return } fmt.Println(string(buf[:n])) if string(buf[:n]) == "exit" { fmt.Println(address, "已退出聊天室。") return } // 可以实现自动回复消息,将收到的消息中的字母转换为大写后发送出去,去掉注释即可。 // conn.Write([]byte(strings.ToUpper(string(buf[:n])))) } } func main() { listen, err := net.Listen("tcp", "127.0.0.1:8888") defer listen.Close() fmt.Println("Listening on ", listen.Addr().String()) if err != nil { fmt.Println("err:", err) return } for { conn, err := listen.Accept() if err != nil { fmt.Println("err", err) return } go HandleConn(conn) } }
以下代码为客户端代码,输入exit即可断开与服务器的连接:
package main import ( "fmt" "net" ) func main() { conn, err := net.Dial("tcp", "127.0.0.1:8888") go HandleRead(conn) if err != nil { fmt.Println("err=", err) } defer conn.Close() var abc string for { fmt.Scanln(&abc) conn.Write([]byte(abc)) if abc == "exit" { fmt.Println("正在退出......") return } } } // HandleRead 用来阅读服务器发送的数据 func HandleRead(conn net.Conn) { buf := make([]byte, 1024) for { n, err := conn.Read(buf) if err != nil { fmt.Println("err:", err) return } fmt.Println(string(buf[:n])) } }