2015-05-03 66 views
0

我有下面的代碼接收UDP數據包:Android的UDP服務器沒有收到數據包

public class AsyncReceiveUdp2 extends AsyncTask<String, Void, Boolean> { 
@Override 
protected Boolean doInBackground(String... f_url) { 
    int udp=111; 
    byte[] packet = new byte[2000]; 
    DatagramPacket dp = new DatagramPacket(packet, packet.length); 
    DatagramSocket ds = null; 
    try { 
     ds = new DatagramSocket(udp); 
     ds.receive(dp); 
     //... 
    } catch (SocketException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (ds != null) { 
      ds.close(); 
     } 
    } 
    return null; 
} 

}

我從Android設備UDP數據發送到計算機。 計算機立即以UDP數據包的形式發送響應。 我將信息保存到SD上的日誌文件中。 而且我看到,我的應用停留在「ds.receive(dp)」行上。並沒有在它之後運行。 我已經在Android設備上針對計算機上的程序進行了測試。 據我所知,在模擬器上接收UDP數據包很棘手。 我無法做到。 重定向不適用於我,因爲它描述了here

另一個重要問題是接收所有發送到設備的數據包。無損。如何修改該代碼?

請幫忙!謝謝!

+0

UDP不是一個無損協議,使用TCP ..它檢查數據包是否已收到並它與一個32位CRC –

+0

協議完整性我工作是UDP協議。沒有機會選擇。謝謝。 – Niaz

+0

好的,但你不能確定會收到一個數據包。這是UDP和TCP之間的區別。 UDP更快,因爲您不檢查是否收到數據包。 TCP的處理包括數據包格式錯誤(CRC錯誤) –

回答

0

把你的接收放在一個while(true)循環中。當你收到一個數據包時,會打電話給一個if(pkg_received){break;} ...或者你想要做的任何事情...... 問題是你可能只能接收一個包並且在收到它之前就會超時。

代碼編輯,沒有測試

while(true) 
    { 


     byte[] message = new byte[60*1024]; 
     DatagramPacket recv_packet = new DatagramPacket(message, message.length); 


     try { 
      socket.receive(recv_packet); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     Log.d("UDP", "S: Receiving...listening on port " + recv_packet.getPort()); 
     String rec_str; 
     rec_str=new String(recv_packet.getData) 

     Log.d("PACKAGE LENGTH",Integer.toString(recv_packet.getLength())); 
} 
相關問題