【问题标题】:Received start of new message but previous message is unfinished收到新消息的开始,但上一条消息未完成
【发布时间】: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


【解决方案1】:

这确实是由于服务器代码中的错误造成的。我引用的代码是正确的,但不是线程安全的,所以我同时写入同一个会话。我通过在会话上同步它来修复它。

【讨论】:

    猜你喜欢
    • 2018-04-24
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2013-08-28
    相关资源
    最近更新 更多