sockets - TCP sockets 和 web sockets 的区别,再来一次

标签 sockets tcp websocket

<分区>

尽我所能理解 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 重新组装成帧,这些帧在每条消息调用一次消息事件处理程序之前组装成消息。

关于sockets - TCP sockets 和 web sockets 的区别,再来一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16945345/

相关文章:

java - 如何使用域名创建客户端套接字

c# - C#发送TCP数据包

java - 维护与服务器端服务的套接字连接是否不利于向桌面应用程序发送通知?

tcp - Go bufio.Scanner 在读取到 Redis 的 TCP 连接时停止

javascript - 如何为浏览器客户端设置 RabbitMQ 绑定(bind)?

带有代理的 Java websocket

Python TCP 服务器,写入客户端?

C - 创建一个 sockaddr 结构

c - 在套接字上写入和读取返回不同的字节数

python - 使用 websocket - Python 从 h.264 视频流中捕获第一张图像