websocket 消息总是会一次全部到达吗?

Posted

技术标签:

【中文标题】websocket 消息总是会一次全部到达吗?【英文标题】:Will websocket messages always arrive entirely, at once? 【发布时间】:2021-03-16 20:15:25 【问题描述】:

这个 websockets 教程https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications 有这个例子:

exampleSocket.onmessage = function(event) 
  var f = document.getElementById("chatbox").contentDocument;
  var text = "";
  var msg = JSON.parse(event.data);
  var time = new Date(msg.date);
  var timeStr = time.toLocaleTimeString();

  switch(msg.type) 
    case "id":
      clientID = msg.id;
      setUsername();
      break;
    case "username":
      text = "<b>User <em>" + msg.name + "</em> signed in at " + timeStr + "</b><br>";
      break;
    case "message":
      text = "(" + timeStr + ") <b>" + msg.name + "</b>: " + msg.text + "<br>";
      break;
    case "rejectusername":
      text = "<b>Your username has been set to <em>" + msg.name + "</em> because the name you chose is in use.</b><br>"
      break;
    case "userlist":
      var ul = "";
      for (i=0; i < msg.users.length; i++) 
        ul += msg.users[i] + "<br>";
      
      document.getElementById("userlistbox").innerhtml = ul;
      break;
  

  if (text.length) 
    f.write(text);
    document.getElementById("chatbox").contentWindow.scrollByPages(1);
  
;

它解析从 websockets 服务器接收到的消息。但是,我可以相信 websocket 服务器发送的 json 总是会立即到达客户端吗?如果它部分到达怎么办?解析它会破坏它。

即使对于非常大的 json 消息,我也可以做出这个假设吗?

我问是因为在 TCP 流上,这是不可能的。消息可能部分到达。

如果无法一次完整接收消息,我怎么知道何时解析 JSON?

【问题讨论】:

【参考方案1】:

是的,每条消息都是作为一个整体接收的。来自 RFC 6455:

1.2。协议概述

成功握手后,客户端和服务器在本规范中称为“消息”的概念单元中来回传输数据。在网络上,一条消息由一个或多个帧组成。 WebSocket 消息不一定对应于特定的网络层框架,因为分段消息可能会被中介合并或拆分。

6.2。接收数据

如果帧包含未分段的消息(第 5.4 节),则表示 已接收到类型为 /type/ 和数据 /data/ 的 WebSocket 消息。如果该帧是分段消息的一部分,则将后续数据帧的“应用程序数据”连接起来形成 /data/。当FIN位(frame-fin)指示接收到最后一个分片时,表示A WebSocket Message Has Being Received带有数据/data/(由“应用程序数据”的串联组成) " 的片段)和类型 /type/ (从片段消息的第一帧注意到)。必须将后续数据帧解释为属于新的 WebSocket 消息。

https://www.rfc-editor.org/rfc/rfc6455

混淆可能来自术语“套接字”,它是一种低级原始操作系统通道,可生成块中的数据。但是,WebSocket 是更高级别的协议。

【讨论】:

以上是关于websocket 消息总是会一次全部到达吗?的主要内容,如果未能解决你的问题,请参考以下文章

如果在消息框中按下“否”,程序会一次又一次地返回消息框?

使用websocket.send时如何知道消息何时到达?

如何确保消息使用 WebSockets 到达目的地?

如何正确管理 websocket 消息?

JSR 356 WebSocket 最大消息大小配置失败

WebSocket 消息每隔几秒就会断断续续