我目前正在使用java.net.Socket从客户端发送消息并从服务器读取消息。到目前为止,我所有的消息都还很短,我从来没有遇到任何问题。

我的一位朋友注意到我没有处理消息碎片,因为数据可能会碎片化,并建议我创建一个缓冲区来处理此问题。我坚持认为TCP可以为我处理,但是我不确定100%。

谁是对的?

另外,我计划将来也用C创建一个客户端。伯克利套接字可以处理消息碎片吗?

详细信息:当前,在Java中,服务器创建一个套接字,并使用InputStream#read()从消息中读取第一个字节。第一个字节确定整个消息的长度,并创建适当长度的字节数组,并调用InputStream#read(byte [])一次,并假定已读取整个消息。

最佳答案

如果您在谈论WebSockets,则可能会混用不同的概念。

一件事是TCP / IP消息分段。

另一件事是缓冲如何工作。您读取数据缓冲区,并且需要一个框架协议,该协议可以告诉您何时具有完整的“消息”(或帧)。基本上,您:


读取缓冲区。
有完整的标题吗?否->转到1,是->继续
读取直到拥有头部指示为消息的所有字节
长度。
有完整的消息吗?否->转到3,是->继续
产量信息。
转到1。


其他不同的是WebSocket消息碎片。 WebSocket已经具有帧协议,并且消息可以拆分为不同的数据帧,并且控制帧可以与数据帧交织:https://developer.mozilla.org/en-US/docs/WebSockets/Writing_WebSocket_servers#Message_Fragmentation

如果要编写WebSocket客户端或服务器,则必须为这种情况做好准备。

关于java - 我是否需要处理套接字的消息碎片?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29525882/

10-11 02:46
查看更多