1 回答

TA貢獻1815條經驗 獲得超6個贊
對于第一個示例,您可以使用ReadLine:
connbuff := bufio.NewReaderSize(conn, 5*1024)
msg, isPrefix, err := connbuff.ReadLine()
if isPrefix {
// too long
}
...
如果isPrefix為真,則該行太長。如果您使用 a,bufio.Scanner它實際上已經具有 64kb 的最大令牌大小。
正如 Tim Cooper 和 Dave C 所說,您可以將其io.LimitedReader用于第二種情況,但是 json 解碼器有一個問題。它使用緩沖 IO,因此它將讀取第一個請求。
為了解決這個問題使用的組合io.MultiReader和io.LimitReader:
// to start with we have nothing buffered (an empty byte slice)
var buffered io.Reader = bytes.NewReader([]byte{})
for {
// combine whatever was in buffered with conn, but only up to 5kb
dec := json.NewDecoder(io.LimitReader(io.MultiReader(buffered, conn), 5*1024))
var req string
err := dec.Decode(&req)
if err == io.EOF {
break
} else if err != nil {
log.Fatalln(err)
}
// we probably read past the message, so save that to buffered
buffered = dec.Buffered()
}
- 1 回答
- 0 關注
- 245 瀏覽
添加回答
舉報