package main import ( "net" "fmt" "strings" ) func HandleConn(conn net.Conn) { //调用完毕 defer conn.Close() //获取客户端的网络地址信息 addr := conn.RemoteAddr().String() fmt.Printf("[%s] connect success", addr) buf := make([]byte, 2048) for true { //读取用户的数据 n, err := conn.Read(buf) if err != nil { fmt.Println("Read data err = ", err) } fmt.Printf("[%s]: %s ", addr, string(buf[:n])) //把数字转换成大写再给用户 if "exit" == string(buf[:n-1]) { //为什么这里要-1,因为在用户输入完以后是以回车确认的,比如用户输入'a',那么对于程序来说实际是输入了'a ’,那这里必须把用户输入的后缀去了,比对才会成功 fmt.Println(addr, "exit") return } //把数据替换为大写,再向用户发送 conn.Write([]byte(strings.ToUpper(string(buf[:n])))) } } func main() { //监听 listener, err := net.Listen("tcp", ":8000") //不写IP地址代表监听的是本机 if err != nil { fmt.Println("listener errinfo = ", err) return } defer listener.Close() for true { //接收用户的请求 conn,err := listener.Accept()//阻塞,等待用户连接 if err != nil { fmt.Println("accept err = ", err) return } //新建一个协程 go HandleConn(conn) } }
那么使用netcat进行测试后就会有这样的结果