websocket是基于流的还是基于包的协议?

yep*_*ons 11 tcp packet websocket

想象一下,我有服务器和客户端通过WebSocket进行通话.每个时间都发送另一个数据块.不同的块可以具有不同的长度.

我保证,如果服务器在一次调用中发送chunk,那么客户端将在一次message回调中收到它,反之亦然?也就是说,WebSocket是否具有嵌入式"打包"功能,所以我不必关心我的数据在传输过程中是否在几个回调中被分割,或者它不是?

obe*_*tet 9

WebSocket 是一种基于消息的协议,因此如果您发送一个数据块作为 WebSocket 消息的有效负载,对等方将收到一个单独的 WebSocket 消息,该消息正是该数据块作为有效负载。


Len*_*ate 8

从理论上讲,WebSocket协议提供了一种基于消息的协议.不过,请记住......

  • WebSocket消息由一个或多个帧组成.
  • 帧可以是完整帧或分段帧.
  • 消息本身没有内置于协议中的任何长度指示,只有帧.
  • 帧的有效载荷长度最多为9,223,372,036,854,775,807字节(由于协议允许63位长度指示符).
  • 碎片化的主要目的是允许在启动消息时发送大小未知的消息,而不必缓冲该消息.

所以...

单个WebSocket"消息"可以包含无限数量的9,223,372,036,854,775,807字节片段.

这可能使实现难以始终通过其API向您提供完整的消息...

因此,在一般情况下,您的问题的答案是WebSocket协议是基于消息的协议,您不必手动构建消息.您用于使用协议的API可能具有适当的消息大小限制(以允许它保证将消息作为单个块传递),或者可以提供流接口以允许无限大小的消息.

这里的标准化过程中,我对此大肆渲染.