我有一个是在一个循环中收到UDP报文的Java应用程序的UDP数据包:该怎么办抵达件
while (running) {
try {
// Block until a packet is received on the port
byte[] buffer = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);
serverSocket.receive(receivePacket);
ByteArrayInputStream byteIn = new ByteArrayInputStream(receivePacket.getData(), 0, receivePacket.getLength());
DataInputStream dataIn = new DataInputStream(byteIn);
// Print packet
String packetString = "";
while((packetString = dataIn.readLine()) != null) {
Log.d("WiFi", packetString);
}
} catch (IOException ex) {
Log.d("WiFi", "Problem receiving: " + ex.toString());
}
}
当我到达的数据包,其中不乏如约到达预期,但每一次的同时,我得到一个数据包被分成两个部分:
103, -5.84, 5.64, 140.72, #A-=-22.53,-50.18,248.83, #G-=52.00,-69.00,-18.00, #M-=-146.66,-155.18,151.06, 2575012
103, -6.51, 5.62, 140.41, #A-=-22.53,-51.20,248.83, #G-=23.00,44.00,-7.00, #M-=-146.21,-156.13,151.06, 2575036
103, -7.23, 5.65, 140.09, #A-=-19.46,-49.15,243.71, #G-=17.00,68.00,-2.00, #M-=-144.85,-155.18,151.06, 2575063
103, -7.76, 5.60, 139.81, #A-=-17.41,-50.18,240.64, #G-=17.00,71.00,0.00, #M-=-143.94,-155.65,153
.47, 2575090
103, -8.51, 5.34, 139.40, #A-=-12.29,-47.10,233.47, #G-=31.00,-1.00,-5.00, #M-=-144.85,-154.70,151.87, 2575135
103, -9.20, 4.76, 138.95, #A-=-15.36,-50.18,239.62, #G-=22.00,30.00,-3.00, #M-=-146.66,-156.13,151.87, 2575200
103, -9.82, 4.46, 138.61, #A-=-15.36,-47.10,239.62, #G-=33.00,1.00,-3.00, #M-=-145.76,-156.13,152.27, 2575266
103, -10.38, 4.07, 138.23, #A-=-14.34,-48.13,235.52, #G-=30.00,4.00,-7.00, #M-=-144.85,-155.65,152.27, 2575372
103, -10.90, 3.76, 137.90, #A-=-14.34,-48.13,237.57, #G-=29.00,19.00,-4.00, #M-=-145.30,-156.13,151.47, 2575520
103, -11.41, 3.53, 137.44, #A-=-15.36,-48.13,235.52, #G-=25.00,18.00,-4.00, #M-=-146.21,-155.18,151.47, 2576917
正如你可以在线路4和5中看到,4最后尾随字符都被切断,其余字符的新的数据包有到达。从我关于UDP的阅读中,大家都警告说UDP不能保证数据包的到来。在我看来,这不是问题;丢失的数据包听到或不会破坏我的应用程序。但是,我没有发现任何关于数据包不一定完整的情况。其实我已经读过并不是发生。
这是怎么处理的?我很难知道已经到达的数据包是否完整,我可以等待下一个数据包并追加数据。
由于在你看到数据包之前IP级别的碎片应该在IP栈中被取消,所以我怀疑服务器正在用两个数据包发送数据。你最好的选择是在Wireshark观察交通状况的同时复制这个状况,看看实际上正在发生什么。这里有足够多不同的移动部件(服务器,网络,操作系统,TCP/IP堆栈等),如果没有看到网络上的网络流量,您不太可能进一步获得更多信息。 –
我下载了WireShark,我正在查看这些数据包。我之前没有用过WireShark,现在我处于摆弄模式。看起来发生的情况是标准数据包大约有156个字节,但有时它将这些数据包组合成一个更大的数据包(我假设操作系统正在实现某种缓冲区?这种情况发生在频繁的通信量时)高达492字节。 [本答案](http://stackoverflow.com/questions/9203403/java-datagrampacket-udp-maximum-buffer-size)意味着我达到了极限。通常对此做什么? – tomsrobots
不,这是指传输层碎片。在应用层,整个数据包到达目的地,或者不到。 UDP决不会将多个源数据报组合成单个IP数据包。您将不得不匹配Wireshark跟踪来调试输出并重新创建条件以查看正在发送的内容。注意IP碎片标志; Wireshark告诉你什么时候检测到碎片。 –