我尝试使用 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/