尽我所能理解 TCP 套接字和 websocket 之间的区别,我已经在这些问题中找到了很多有用的信息:
等等……
在我的调查中,我在 wikipedia 上检查了这句话:
Websocket differs from TCP in that it enables a stream of messages instead of a stream of bytes
我不太确定它的确切含义。你的解释是什么?
当您使用普通 TCP 套接字从缓冲区发送字节时,发送函数返回已发送缓冲区的字节数。如果是非阻塞套接字或非阻塞发送,则发送的字节数可能小于缓冲区的大小。如果它是阻塞套接字或阻塞发送,则返回的数字将与缓冲区的大小匹配,但调用可能会阻塞。使用 WebSockets,传递给 send 方法的数据总是要么作为整个“消息”发送,要么根本不发送。此外,浏览器 WebSocket 实现不会阻止发送调用。
但是在事物的接收端有更重要的区别。当接收方在 TCP 套接字上执行 recv
(或 read
)时,无法保证返回的字节数对应于 TCP 套接字上的单个发送(或写入)发送方。它可能相同,可能更少(或为零),甚至可能更多(在这种情况下,会收到来自多个发送/写入的字节)。使用 WebSockets,消息的接收者是事件驱动的(您通常注册一个消息处理例程),事件中的数据始终是另一方发送的整个消息。
请注意,您可以使用 TCP 套接字进行基于消息的通信,但您需要一些额外的层/封装,将帧/消息边界数据添加到消息中,以便可以从片段中重新组合原始消息。事实上,WebSockets 建立在普通的 TCP 套接字之上,并使用包含每个帧大小的帧头并指示哪些帧是消息的一部分。 WebSocket API 将 TCP 数据 block 重新组装成帧,这些帧在每条消息调用一次消息事件处理程序之前组装成消息。