java - 我发送的TCP数据被分成不同的颗粒

标签 java sockets tcp serversocket tcpserver

我尝试使用 TCP 发送数据。

我的代码如下:

ServerSocket sSocket = new ServerSocket(PORT_NUMBER);
Socket clientSocket = serverSocket.accept(); 

OutputStream clientOs = clientSocket.getOutputStream();

int[] x = new int[4];
x[0] = 0x01;
x[1] = 0x02;
x[2] = 0x03;
x[3] = 0x04;

for (int a : x) {
    clientOs.write(a);
}

我检查了从wireshark发送数据,我看到如下:

"109","22.797801000","---$hostIP---","---$sourceIP---","TCP","67","krb524 > 6854 [PSH, ACK] Seq=1 Ack=18 Win=29056 Len=1 TSval=23099797 TSecr=767724"
"111","23.020747000","---$hostIP---","---$sourceIP---","TCP","68","krb524 > 6854 [PSH, ACK] Seq=2 Ack=19 Win=29056 Len=2 TSval=23099852 TSecr=767778"
  • 第一个是 01(长度 1)
  • 第二个包是020304 (长度3)

为什么我看到 2 个不同的包。为什么它看起来不像这样:01020304(长度4)

如何将数据仅作为一个包发送?

最佳答案

与 UDP 相比,TCP 是一种基于流的协议(protocol)。这意味着,您根本无法做出任何假设,尤其是数据如何在各个网络包上分割。

这反过来意味着,在另一方面,您无法猜测通过对 tcp 套接字的单个读取调用将获得多少数据。如果您的数据是结构化的,则必须采用(带内)协议(protocol)来反射(reflect)该结构(即长度字节、固定数据结构等)

话虽如此,在您的情况下,如果您将数据添加到一个字节数组中并通过一次调用 write() 将其发送,那么您的数据很可能会以单个数据包的形式发送。 。我没有看到操作系统在这种情况下将其拆分的原因。

关于java - 我发送的TCP数据被分成不同的颗粒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46567695/

相关文章:

java - 如何修复包含 Textview 的线性布局的 Scrollview

java - 使用 JFreeChart 库在 awt.Image 上绘制轴

Java邮件 : MessagingException: Got bad greeting from SMTP host — Error Code 250

delphi如何设置tcpserver接收字符串数据

node.js - 用nodeJS打洞?

java - 计算小时加一

Java AWS MySQL 和 hibernate

c - AF_UNIX 套接字中缓冲区的最大长度

python-3.x - 为什么关闭与服务器的连接?

使用 phonegap 的 android tcp/ip 客户端