2014-07-18 3 views
1

연결에서 정보 스트림을 읽으려고합니다. 나는 그것의 서버 부분을 작성하지 않았고, 프로토콜을 수정하는 것에 대한 액세스 권한이 없다. (그렇지 않으면 프로토콜을 훨씬 더 친숙하게 만들었을 것이다.)임의의 양의 버퍼를 Golang 버퍼에 읽어들입니다.

Go에 서비스를 작성하려고하는데 루프에서 버퍼에 바이트의 임의의 수와 다른 핸들러에 떨어져에 전달이 내 현재 설정

buf := make([]byte, 256) 
for { 
    n, err := conn.Read(buf) 
    fmt.Println(string(buf)) 
    if err != nil || n== 0 { 
     return 
    } 
    Handle(buf[:n]) 
} 

입니다

을 (나는 또한이 부분을 수정할 수 없습니다) 충분히 바이트가있을 때 잘 작동 read ... 그러나 스트림의 끝에는 읽을 수있는 256 바이트가 없습니다. Read()가 정상적으로 복귀하는 동안 256 바이트 버퍼를 보존 할 수있는 방법이 있습니까? 당신이 사용할 수있는 연결의 전체 흐름을 읽고 싶다면

+0

이해가 아니에요. "우아한 반환"이란 무엇입니까? Is Handle 함수는 256 길이의 바이트 만 사용합니까? – chendesheng

+2

당신은'EOF'를 제대로 다루지 않습니다 - [io.Reader] (http://golang.org/pkg/io/#Reader) 문서를보세요 -'EOF'는'n! = 0 '. 이것이 당신의 문제인지 아닌지 확실하지 않습니다! –

답변

3

:

var b bytes.Buffer 
    if _, err:= io.Copy(&b, conn); err != nil { 
     return err 
    } 

    Handle(b.Bytes()) 
+1

또는 [ioutil.ReadAll] (http://golang.org/pkg/io/ioutil/#ReadAll)을 사용할 수 있습니다. –

관련 문제