gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:10:44 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com