我在 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() 使用先前的值并截断新到达的消息。[请注意:这是一种随机行为,不会一直发生]
现在的问题是,每次在循环中收到新消息时,如何更改或刷新此属性?