2013-09-25 3 views
0

У меня есть UDP сервер пишет в C языка сайта вещающий paquets над моей локальной сети каждые 5 сек на порт 3001.Android Udp: Как получить DatagramPacket от LAN

я создаю андроид приложение в качестве клиента 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. Вероятно, вы получили сообщение, и после него цикл заставляет datagramsocket прослушиваться снова.

+0

Спасибо за ваше предложение, но doesn'nt все еще работает ... – user2817124

+0

Проблема возникает из устройства, если я запускаю простой udp-клиент в java, как это один: – user2817124

0

Не создавайте и не закрывайте розетку каждый раз вокруг цикла. Сначала создайте его и закройте. В настоящее время есть окна времени, в течение которых сокет не существует, поэтому датаграммы к нему отбрасываются: также все поставленные в очередь датаграммы удаляются каждый раз, когда вы его закрываете.

+0

Спасибо за ваше предложение, но он еще не работает ... – user2817124

0

У меня была эта проблема. Вам необходимо добавить разрешения в манифест андроида.

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

Также активируйте трансляции в гнезде.

clientSocket.setBroadcast(true); 

Как и все остальные, прежде чем мне было сказано, что ваш код также никогда не покидает время цикла, так что он никогда не выходит на линию, где тост displayed.Remember, что вы не можете показать Тост сообщения от doInBackground, как это доступ поток пользовательского интерфейса, вы можете сделать это только из функций 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; 

} 

Теперь, когда вы проверяете журналы, вы должны быть в состоянии увидеть значение строки, полученной.