2013-07-29 3 views
3

내 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 
} 
+0

참고로, 기본적으로 'conn.SetNoDelay (true)'를 수행 할 필요가 없습니다. (http://golang.org/pkg/net/#TCPConn.SetNoDelay). 또한,'Write'는 기록 된 바이트 수와 오류를 반환합니다. '_, err = conn.Write ([] byte (message))'를 해보고 그 문제에 대해 밝혀 줄 수 있는지보십시오. – Intermernet

+0

방금 ​​코드를 테스트했는데 (변경 사항은 두 가지가 있지만 중요하지는 않습니다. http://play.golang.org/p/CaVynZMXWJ 참조) 예상대로 작동하는 것 같습니다. 문제가 서버 측에 없다고 확신합니까? – Intermernet

+0

예 그냥 conn.SetNoDelay (true)를 추가하십시오. – enzoyang

답변

5

뭔가 문제가있다.

포트 5432에서 로컬 TCP 서버를 만드는 경우이를 테스트 할 수 있습니다.

아래의 서버 코드를 실행 한 다음 클라이언트 코드를 테스트 해보십시오. 받은 모든 데이터를 표준 출력으로 에코합니다.

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) 
    } 
} 

Enter 키를 누르 자마자 클라이언트에게 보낸 각 줄이 개행없이 인쇄되어 있어야합니다.

1

문제는 서버쪽에 있습니다.

func handleConnection(conn net.Conn) { 
// I didn't put it in for loop 
message, err := bufio.NewReader(conn).ReadString('\n') 
} 
+0

쉬운 실수로 만들 수 있습니다 :-) – Intermernet

관련 문제