我的基于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要低得多。
这是否意味着我在处理前一个消息时收到了消息?意思是我必须调用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 ...;
}
每当我在其中写入一个对象时我都会关闭作者,所以这对我来说很好。
答案 0 :(得分:0)
这确实是由于服务器代码中的错误造成的。我引用的代码是正确的但不是线程安全的,所以我同时写入同一个会话。我通过在会话上同步来修复它。