我尝试使用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"
为什么我看到2个不同的包裹。为什么它看起来不像这样:01020304(length4)
如何只将数据作为一个包发送?
答案 0 :(得分:1)
TCP是 - 与UDP相反 - 基于流的协议。这意味着,您根本无法做出任何假设,特别是不能在单个网络包上拆分数据。
这反过来意味着,另一方面,您无法猜测通过对tcp套接字的单次读取调用将获得多少数据。如果您的数据是结构化的,则必须使用(带内)协议来反映这种结构(即长度字节,固定数据结构等)。
话虽如此,如果您将数据一起添加到一个字节数组中并通过一次调用发送到write()
,那么您的数据将在您的情况下以单个数据包发送。我没有看到原因,为什么操作系统会在这种情况下拆分它。
答案 1 :(得分:0)
为了最大限度地减少获取1字节数据包的可能性,您可以将整数数组按到一个字节数组中,然后用它发送整个字节数组。
write(byte [] b,int off,int len)