내 GO 버전이 1.1.1입니다.golang tcp 소켓이 즉시 쓰기 후 메시지를 보내지 않습니다.
연결이 끊긴 후 메시지가 수신되지만 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
}
참고로, 기본적으로 'conn.SetNoDelay (true)'를 수행 할 필요가 없습니다. (http://golang.org/pkg/net/#TCPConn.SetNoDelay). 또한,'Write'는 기록 된 바이트 수와 오류를 반환합니다. '_, err = conn.Write ([] byte (message))'를 해보고 그 문제에 대해 밝혀 줄 수 있는지보십시오. – Intermernet
방금 코드를 테스트했는데 (변경 사항은 두 가지가 있지만 중요하지는 않습니다. http://play.golang.org/p/CaVynZMXWJ 참조) 예상대로 작동하는 것 같습니다. 문제가 서버 측에 없다고 확신합니까? – Intermernet
예 그냥 conn.SetNoDelay (true)를 추가하십시오. – enzoyang