【发布时间】:2015-06-21 17:06:37
【问题描述】:
我的基于 Web 的 WebSocket 客户端以这种方式连接到我的 Java 服务器:
this.ws = new WebSocket(this.url);
this.ws.onmessage = m => {
let data;
try {
data = JSON.parse(m.data);
} catch (e) {
// Log error
return;
}
doALotOfStuff(data);
};
但有时我会在 Chrome 中收到此错误:
到“myServerUrl”的 WebSocket 连接失败:收到新的开始 消息,但上一条消息未完成。
我找到了related source code in Chromium 和一些关于它的讨论,但这都是关于延续帧和 OpCode 的,这是一个比我理解的可以访问的 API 低得多的 API。
这是否意味着我在处理上一条消息时收到了一条消息?这意味着我必须调用 setTimeout(...,0) 来异步处理我的所有消息?但是每个人都应该这样做,为什么浏览器不处理呢?
我在 Firefox 中遇到了类似的错误:
与 myServerUrl 的连接在页面加载时中断。
我想这更令人困惑,因为我没有重新加载页面,它发生在 websocket 会话的中间。
所以我猜这可能不是 Chromium 的错误,但是我该如何处理呢?
或者我在发送消息时做错了什么?我使用 javax-websocket-api-1.0,我只是这样做:
try (Writer writer = session.getBasicRemote().getSendWriter()) {
JacksonSerializer.serialize(object, writer);
} catch (final SerializerException | IOException e) {
throw ...;
}
每次我在其中写入对象时,我都会关闭编写器,所以这对我来说很好。
【问题讨论】:
-
这听起来像是服务器上的问题,即在违反 webSocket 协议的地方(未完成的消息帧)如何发送消息,可能是 Java webSocket 库的问题,也可能是您如何发送消息的问题正在使用它。
-
看起来问题是,您的服务器将
FIN位设置为 false。所以客户端期望下一个数据帧将opcode设置为continuation,但这并没有发生,因此错误。见 - developer.mozilla.org/en-US/docs/WebSockets/… -
感谢您的输入,我更准确地查看了服务器代码并发现了问题。谢谢!
标签: java javascript websocket