我在Android中使用UDP接收數據時遇到了一個非常奇怪的問題。 我正在寫一個應用程序來控制Android設備的WiFi模塊。我能夠成功地發送數據到這個遠程WiFi設備。但是我無法從這個wifi設備收到'完整'的數據包。收到不完整的UDP數據包
我的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()使用之前的值並截斷了新到達的消息。現在的問題是,每當我在循環中收到新消息時,如何更改或刷新此屬性?
你試過增加緩衝區大小嗎? – 2012-08-08 16:48:00
您是否將整個數據發送到一個數據包中? – 2012-08-08 16:51:05
@Atlos:是的,從我的代碼中可以看到,我已經使用了500字節的大小,我期望的數據甚至不會超過100! – 2012-08-08 17:10:05