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 关注
- 218 浏览
添加回答
举报