我在Android中使用UDP接收数据时遇到了一个非常奇怪的问题。 我正在编写一个应用程序来控制Android设备的wifi模块。我能够成功地将数据发送到这个远程wifi设备。但是我无法从这个wifi设备接收到“完整”的数据包。
我在android中的代码是:
public static void receivePacket(int receiverPort, Context context) {
DatagramSocket socket = null;
String text = "";
try {
byte[] message = new byte[1500];
DatagramPacket packet = new DatagramPacket(message, message.length);
socket = new DatagramSocket(receiverPort);
//socket.setSoTimeout(5000);
for (int i = 0; i < 12; i++) {
socket.receive(packet);
text += new String(message, 0, packet.getLength()) + "\n";
}
socket.close();
Log.d("Received Message", text);
} catch (Exception e) {
Log.e("UDP", "S: Error", e);
} finally {
if(null != socket){
socket.close();
}
}
}
所以,如果我期待数据“$ BEG1; $ PID2; $ PIP192.168.15.245; $ PPN80; $ DAT987654321; $ END1;”我只得到“$ BEG1; $ PID2; $ PIP192.168.15.245; $ PPN80; $ DAT98”
我尝试使用UDP WinChat应用程序来查看它是否能够从wifi模块获取消息并且我能够获取整个数据。
此外,如果我尝试使用UDP Win Chat应用程序向Android设备发送一条很长的消息,我就能获得整个数据!
我完全糊涂了!请帮助。
我能够找出问题所在。 (虽然还没有找到修复:(...)
从上面的代码我开始使用相同的packet.getLength()进行每次迭代,假设它每次都会根据收到的数据进行更改。但遗憾的是,这不是预期的行为。 getLength()使用前一个值并截断新到达的消息。 [请注意:这是随机行为,不会一直发生]
现在问题是,每当我在循环中收到新消息时,如何更改或刷新此属性?
答案 0 :(得分:4)
您需要在每次接收之前重置DatagramPacket长度。否则它会缩小到目前为止收到的最小数据包。