我发送的TCP数据被分成不同的粒子

时间:2017-10-04 14:39:47

标签: 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(length4)

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

2 个答案:

答案 0 :(得分:1)

TCP是 - 与UDP相反 - 基于的协议。这意味着,您根本无法做出任何假设,特别是不能在单个网络包上拆分数据。

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

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

答案 1 :(得分:0)

为了最大限度地减少获取1字节数据包的可能性,您可以将整数数组按到一个字节数组中,然后用它发送整个字节数组。

write(byte [] b,int off,int len)