golang中的tcp编程
1. tcp server
package main import ( "bufio" "fmt" "net" ) func main() { // 1. 监听端口 listener, err := net.Listen("tcp", "127.0.0.1:8080") if err != nil { fmt.Println("listen fail err", err) return } defer listener.Close() for { // 2. 接收客户端请求建立链接 conn, err := listener.Accept() if err != nil { fmt.Println("accept fail err", err) continue } // 3. 创建goroutine处理链接 go process(conn) } } func process(conn net.Conn) { defer fmt.Println("conn链接关闭了") defer conn.Close() // 关闭链接 reader := bufio.NewReader(conn) for { var buf [4096]byte n, err := reader.Read(buf[:]) // 读取数据 if err != nil { break } recvStr := string(buf[:n]) fmt.Println("收到Client发来的数据:", recvStr) recvStr = "serer" + recvStr conn.Write([]byte(recvStr)) } }
2. tcp client
package main import ( "bufio" "fmt" "net" "os" "strings" ) func main() { // 建立与服务器的链接 conn, err := net.Dial("tcp", "127.0.0.1:8080") if err != nil { fmt.Println("Dial fail err", err) return } // 关闭链接 defer conn.Close() inputReader := bufio.NewReader(os.Stdin) // 进行数据的收发 for { input, _ := inputReader.ReadString('\n') inputInfo := strings.Trim(input, "\r\n") if strings.ToUpper(inputInfo) == "Q" { // 如果用户输入的是q/Q就退出 return } // 发送数据 _, err := conn.Write([]byte(inputInfo)) if err != nil { fmt.Println("Write fail err", err) return } // 接收数据 buf := [4096]byte{} n, err := conn.Read(buf[:]) if err != nil { fmt.Println("Read fail err", err) return } fmt.Println("收到server发来的数据:", string(buf[:n])) } }