我正在寻找最有效的解决方案,有很多方法可以从套接字读取数据并解码 json。我显然应该使用 json.Encoder 和 json.Decoder,因为它们适用于套接字的流式传输性质,但是我有特定的规则来防止套接字泛滥,如果有单个消息 > 5 Kb,我必须关闭连接。我的消息结构是 JSON RPC。
在以下示例中,我可以检查长度并应用策略:
connbuf := bufio.NewReader(conn)
msg, err := connbuf.ReadBytes('\n')
if len(msg) > 5 * 1024 {
conn.Close()
}
...
var req JSONRequest
err = json.Unmarshal(message, &req)
...
但是如果客户端推送没有分隔符的兆字节数据,这些数据将在应用程序中,在服务器断开客户端之前已经在 msg 变量中。相当脆弱。
第二个例子使用解码器,根本没有机会检查大小。
dec = json.NewDecoder(conn)
for {
var req JSONRequest
if err := dec.Decode(&req); err == io.EOF {
break
} else if err != nil {
log.Println(err.Error())
return err
}
...
}
您可以向我建议的最佳方法是什么?谢谢。
红糖糍粑
相关分类