java - 我必须处理套接字的消息碎片吗?

标签 java c websocket

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

我的一个 friend 注意到我没有处理消息碎片,数据可能会碎片化,并建议我应该创建一个缓冲区来处理这个问题。我坚持让 TCP 为我处理这个,但我不是 100% 确定。

谁是对的?

此外,我计划将来也用 C 语言创建一个客户端。 Berkeley 套接字是否处理消息碎片?

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

最佳答案

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

一件事是 TCP/IP 消息碎片。

另一件事是缓冲的工作原理。您读取数据缓冲区,并且需要一个成帧协议(protocol)来告诉您何时有完整的“消息”(或帧)。基本上你:

  1. 读取缓冲区。
  2. 有完整的标题?否->转到1,是->继续
  3. 读取直到拥有头部指示的所有字节作为消息 长度。
  4. 有完整的消息吗?否->转到3,是->继续
  5. 让步消息。
  6. 转到 1。

另一个不同的是 WebSocket 消息碎片。 WebSocket 已经有了框架协议(protocol),消息可以拆分成不同的数据帧,控制帧可以与数据帧交错:https://developer.mozilla.org/en-US/docs/WebSockets/Writing_WebSocket_servers#Message_Fragmentation

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

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

相关文章:

java - 如何使用 Eclipse 捕获 Java 软件的结构

c - 'printf' 从整数生成指针而不进行强制转换

Java Websocket 在向同一套接字发出下一个请求之前等待响应

java - 使用 Math.random() 每次以随机顺序生成 0, 1, 2, 3 (偶数),不重复?

java - 过滤 java.util.Scanner 输入?

c - 关于访问不同源文件中定义的结构

java - Spring WebSocket 从服务器发送多个对值消息

PHP:使用 Golang 处理 websocket 连接

java - 如何在 netbeans 的 jtable 中显示查询结果

c - 将指针从 C 传递到 fortran 子例程