2013-09-25 26 views
0

接收的DatagramPacket我有一個UDP服務器用C langage這在我的LAN每5秒廣播paquets寫道,在端口3001的Android UDP:如何從LAN

我創建一個Android應用程序作爲UDP客戶端,正在偵聽端口3001(在AsyncTask線程中)並且它正在運行,直到receive()方法,似乎沒有數據在此端口上被檢測到。

這裏是我的代碼:

private class ConnectionTask extends AsyncTask<Void, Integer, Void> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 

     String receivedString = ""; 

     byte[] receiveData = new byte[1024]; 

     DatagramSocket clientSocket; 
     try { 
      while(true){ 
       clientSocket = new DatagramSocket(5000); 
       DatagramPacket receivePacket = new DatagramPacket(receiveData, 
         receiveData.length); 
       clientSocket.receive(receivePacket); 
       receivedString = new String(receivePacket.getData()); 
      } 


     } catch (SocketException e) { 
      Log.v("SocketExceptionOccured", e.toString()); 
      e.printStackTrace(); 
      //clientSocket.close(); 
     } catch (IOException e) { 
      Log.v("IOExceptionOccured", e.toString()); 
      e.printStackTrace(); 
      //clientSocket.close(); 
     } 

     Toast.makeText(getBaseContext(), receivedString, Toast.LENGTH_LONG) 
       .show(); 

     return null; 

    } 

} 

測試我的代碼,我自己調試設備,用USB線。

我用我的電腦上運行的一個簡單的UDP客戶端(C)測試了我的服務器,並且通信正常。

我不知道爲什麼這段代碼不起作用。有人有想法嗎?

感謝,

+0

你是什麼意思,它不起作用?顯示連接兩邊的一些日誌,看看它可能出錯的地方 – dumazy

回答

0

你永遠離開while循環。您的消息可能已收到,並且之後,循環會導致數據封包再次偵聽。

+0

感謝您的建議,但仍然不能正常工作... – user2817124

+0

問題來自設備,如果我在java中運行一個簡單的udp客戶端一個: – user2817124

0

不要在每次循環時創建並關閉套接字。之後創建並關閉它。目前有些時間窗口不存在套接字,因此數據報被丟棄:同樣,每當你關閉它時,所有排隊的數據報都被丟棄。

+0

感謝您的建議,但仍然無法正常工作...... – user2817124

0

我有這個相同的問題。您需要在Android清單中添加權限

<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> 

還在套接字中啓用廣播。

clientSocket.setBroadcast(true); 

像其他人一樣我之前提到的,你的代碼也不會離開while循環,所以它永遠不會在那裏敬酒是displayed.Remember,你不能從doInBackground顯示敬酒消息,因爲這是使用的線路UI線程,你只能從postExecute和preExecute函數中這樣做。這會導致你的應用程序崩潰。要檢查您收到的數據,您可以調試它或記錄它。

您的最終doInBackground應該是這樣的

@Override 
protected Void doInBackground(Void... arg0) { 

    String receivedString = ""; 

    byte[] receiveData = new byte[1024]; 

    DatagramSocket clientSocket; 
    try { 
     while(true){ 
      clientSocket = new DatagramSocket(5000); 
      DatagramPacket receivePacket = new DatagramPacket(receiveData, 
        receiveData.length); 
      clientSocket.setBroadcast(true); 
      clientSocket.receive(receivePacket); 
      receivedString = new String(receivePacket.getData()); 
      Log.i("Received String= "+receivedString); 
     } 


    } catch (SocketException e) { 
     Log.v("SocketExceptionOccured", e.toString()); 
     e.printStackTrace(); 
     //clientSocket.close(); 
    } catch (IOException e) { 
     Log.v("IOExceptionOccured", e.toString()); 
     e.printStackTrace(); 
     //clientSocket.close(); 
    } finally{ 
     if(clientSocket!=null){ 
      clientSocket.close(); 
     } 
    } 

    return null; 

} 

現在,當您檢查日誌,你應該能夠看到收到的字符串的值。