go tcp服务器 客户端
来源:原创
时间:2019-03-15
作者:脚本小站
分类:GoLang
tcp_server.go
package main import ( "fmt" "net" ) // 处理用户请求 func HandleConn(conn net.Conn) { defer conn.Close() addr := conn.RemoteAddr().String() fmt.Println(addr, "connect sucessful") buf := make([]byte, 2048) for { n, err := conn.Read(buf) if err != nil { fmt.Println("err = ", err) return } fmt.Printf("[%s]: %s\n", addr, string(buf[:n])) if string(buf[:n-2]) == "exit" { fmt.Println(addr, "exit") return } conn.Write([]byte("Send Successfuly\n")) } } func main() { listener, err := net.Listen("tcp", "127.0.0.1:8080") if err != nil { fmt.Println("err = ", err) return } defer listener.Close() for { conn, err := listener.Accept() if err != nil { fmt.Println("err = ", err) return } go HandleConn(conn) } }
tcp_client.go
package main import ( "fmt" "net" "os" ) func main() { ch := make(chan int) conn, err := net.Dial("tcp", "127.0.0.1:8080") if err != nil { fmt.Println("net.Dial err = ", err) return } defer conn.Close() // 接收键盘数据 go func() { str := make([]byte, 1024) for { n, err := os.Stdin.Read(str) if err != nil { fmt.Println("os.Stdin.Read err = ", err) return } if string(str[:n]) != "\r\n" { conn.Write(str[:n]) } if string(str[:n-2]) == "exit" { ch <- 1 } } }() // 接收服务器数据 buf := make([]byte, 1024) for { n, err := conn.Read(buf) // Read会阻塞 if err != nil { if <-ch == 1 { // 也会阻塞,只能将<-ch放到到这,要不然就执行不到Read了 return } else { fmt.Println("conn.Read err = ", err) return } } fmt.Println(string(buf[:n])) } }