WebSocket消息是否总是一次性全部到达?

3
这个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服务器接收到的消息。但是,我能相信由WebSockets服务器发送的JSON数据总是一次性到达客户端吗?如果它只到达了部分数据,那么解析就会出现问题。

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

我之所以问这个问题,是因为在TCP流中,这是不可能的。消息可能只会部分到达。

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

1个回答

4
是的,每个消息都作为一个整体接收。根据RFC 6455:
1.2. 协议概述
在成功握手后,客户端和服务器以在本规范中称为“消息”的概念单位来回传输数据。在网络上,消息由一个或多个帧组成。WebSocket 消息不一定对应于特定的网络层分帧,因为片段消息可能会被中间件合并或拆分。
6.2. 接收数据
如果帧包含未分段的消息(第5.4节),则称已接收 WebSocket 消息,类型为/type/,数据为/data/。如果帧是分段消息的一部分,则将随后的数据帧的“应用数据”连接起来形成 /data/。当通过 FIN 位(frame-fin)指示接收到最后一个片段时,将说已接收 WebSocket 消息,数据为/data/(由片段的“应用数据”连接而成),类型为/type/(从分段消息的第一个帧中记录)。随后的数据帧必须被解释为属于新的 WebSocket 消息。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接