我的GO版本是1.1.1
连接关闭后服务器收到的消息,但设置了NoDelay。
有什么不对
addr, _ := net.ResolveTCPAddr("tcp", "localhost:5432") conn, err := net.DialTCP("tcp", nil, addr) defer conn.Close() if err != nil { fmt.Println("connect fail") return } err = conn.SetNoDelay(true) if err != nil { fmt.Println(err.Error()) } for { var message string _, err := fmt.Scanln(&message) if err != nil && err.Error() != "unexpected newline" { fmt.Println("input finished", err) break } if message == "" { fmt.Println("no input, end") break } // message = fmt.Sprintf("%s\n",message) //fmt.Fprintf(conn, message) // send immediately but following message won't send any more conn.Write([]byte(message)) // won't send until connection close }
您的代码似乎没有任何根本性的错误,因此我猜错误是在服务器端。
如果在端口5432上创建本地TCP服务器,则可以对此进行测试。
尝试运行下面的服务器代码,然后针对它测试客户端代码。它只是将所有接收到的数据回显到stdout。
package main import ( "io" "log" "net" "os" ) func main() { l, err := net.Listen("tcp", "localhost:5432") if err != nil { log.Fatal(err) } defer l.Close() for { conn, err := l.Accept() if err != nil { log.Fatal(err) } go func(c net.Conn) { defer c.Close() io.Copy(os.Stdout, c) }(conn) } }
按下回车键后,您应该看到发送给客户端的每一行都已打印(没有换行符)。