Go WebSocket客户端如何知道消息已被完全读取?

Go WebSocket客户端如何知道消息已被完全读取?,go,websocket,Go,Websocket,我过去是这样做的: ... ws,err:=websocket.Dialurl,来源 ... var buffer=make[]字节,512 var rs=make[]字节,0,512 L: 为了{ m、 错误:=ws.Readbuffer 如果错误!=零{ 如果err==io.EOF{ 打破L } fmt.Printlnerr.Error 回来 } rs=附件,缓冲区[:m]。。。 如果m=ws.Len-4{ 打破L } } 这边可以 但是数字4是一个神奇的密码 有没有办法找到邮件的最大长度

我过去是这样做的:

... ws,err:=websocket.Dialurl,来源 ... var buffer=make[]字节,512 var rs=make[]字节,0,512 L: 为了{ m、 错误:=ws.Readbuffer 如果错误!=零{ 如果err==io.EOF{ 打破L } fmt.Printlnerr.Error 回来 } rs=附件,缓冲区[:m]。。。 如果m<512{ 打破L } } 这有一个错误:如果消息的长度正好是512、1024或2048。。。循环永不中断;它将停留在ws.Read并等待,而不会抛出io.EOF

后来我发现ws.Len总是比消息的长度长4倍

我将代码改写为:

var buffer=make[]字节,512 var rs=make[]字节,0,512 var总和=0 L: 为了{ m、 错误:=ws.Readbuffer 如果错误!=零{ 如果err==io.EOF{ 打破L } fmt.Printlnerr.Error 回来 } rs=附件,缓冲区[:m]。。。 总和+=m 如果总和>=ws.Len-4{ 打破L } } 这边可以

但是数字4是一个神奇的密码

有没有办法找到邮件的最大长度

有些朋友建议分离消息包,但我认为WebSocket不应该考虑分组打包或分离。


WebSocket客户端阅读消息的最合适方式是什么?

看起来您正在使用golang.org/x/net/WebSocket包。使用该包的读取方法无法可靠地检测消息边界

若要修复此问题,请使用读取消息

var msg string
err := websocket.Message.Receive(ws, &msg)
if err != nil {
  // handle error
}
// msg is the message
请注意,报告中说:

此软件包目前缺少替代和更积极维护的WebSocket软件包中的一些功能:


大猩猩并演示如何阅读消息。

您用于此web套接字连接的软件包是什么?@ASHWINRAJEEV golang.org/x/protobuf/proto
var msg string
err := websocket.Message.Receive(ws, &msg)
if err != nil {
  // handle error
}
// msg is the message