2012-08-08 265 views
1

我在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()使用之前的值並截斷了新到達的消息。現在的問題是,每當我在循環中收到新消息時,如何更改或刷新此屬性?

+0

你試過增加緩衝區大小嗎? – 2012-08-08 16:48:00

+0

您是否將整個數據發送到一個數據包中? – 2012-08-08 16:51:05

+0

@Atlos:是的,從我的代碼中可以看到,我已經使用了500字節的大小,我期望的數據甚至不會超過100! – 2012-08-08 17:10:05

回答

4

您需要在每次接收之前重置DatagramPacket長度,否則不斷收縮到目前爲止收到的最小數據包。

+0

完美!是的,它的工作。這些日子真是太失望了。感謝EJP。 – 2012-08-09 14:15:15

+0

@ mervyn.777請不要將您的代碼編輯到我的答案中。把它納入你的問題。 – EJP 2012-08-12 10:05:55