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 消息总是会一次全部到达吗?的主要内容,如果未能解决你的问题,请参考以下文章