2015-05-22 3 views
2

Я пытаюсь создать простую программу, которая будет получать UDP-пакеты из модуля WiFi. Модуль WiFi отправляет пакет каждые 5 секунд, но я не смог получить его успешно.Почему мое простое приложение не принимает UDP-пакеты

Использование тостов в качестве способа отладки, я получаю их в правильном порядке до «НЕ ДОПУСКАЕТСЯ ЗДЕСЬ», что говорит о том, что проблема заключается в «socket.receive (packet) ' линия.

У кого-нибудь есть представление о том, почему он может не работать? Я также пробовал варианты кода, просматривая множество вопросов/примеров в Интернете, но все они все еще приводят к проблеме с линией «socket.receive (пакет)».

Кроме того, я написал сценарий python для выполнения того же самого, ищет UDP-пакеты на одном и том же порту и запускаю его с QPython, он получает пакеты, поэтому кажется, что пакеты отправляются WiFi модулем и получена на планшете, это просто, что приложение по какой-то причине не будет считывать данные.

Любая помощь или понимание будут очень благодарны, благодарю вас.

Вот код:

public void run() { 

    Toast.makeText(this, "RIGHT BEFORE TRY", Toast.LENGTH_LONG).show(); 

    DatagramSocket socket; 
    DatagramPacket packet; 


    try { 
     Toast.makeText(this, "IN THE TRY", Toast.LENGTH _LONG).show(); 
     socket = new DatagramSocket(9750); 
     byte[] buf = new byte[1024]; //buffer 
     socket.setSoTimeout(100000); 
     Toast.makeText(this, "Timeout is: " + socket.getSoTimeout(), Toast.LENGTH_LONG).show(); 
     //DatagramPacket packet = new DatagaramPacket(buf, buf.length); 
     //Toast.makeText(this, "PACKET SIZE IS: "+buf.length, Toast.LENGTH_LONG).show(); 

     // while(true) { 
     Toast.makeText(this, "IN THE WILD!", Toast.LENGTH_LONG).show(); 
     packet = new DatagramPacket(buf, buf.length); 
     Toast.makeText(this, "PACKET SIZE IS: " + buf.length, Toast.LENGTH_LONG).show(); 

     try { 
      //socket.receive(packet); 
      socket.receive(packet); 
      Toast.makeText(this, "GOT SOMETHING!", Toast.LENGTH_LONG).show(); 
     } 
     catch (Exception i) { 
      // TODO Auto-generated catch block 
      //i.printStackTrace(); 
      Toast.makeText(this, "DIDN'T GET IT HERE EITHER!", Toast.LENGTH_LONG).show(); 
     } 
     //byte[] result = new byte[packet.getLength()]; 
     byte[] result = packet.getData(); 
     System.arraycopy(packet.getData(), 0, result, 0, packet.getLength()); 
     String msg = new String(result); 
     Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); 
     Toast.makeText(this, "END WHILE!", Toast.LENGTH_LONG).show(); 
     //} 

    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     //e.printStackTrace(); 
     Toast.makeText(this, "DIDN'T GET IT!", Toast.LENGTH_LONG).show(); 

    } 

} 

Update: После первых двух ответов, похоже, что мы пытались сделать сетевые операции в основном потоке, что не выполнимо, так что мы в настоящее время пытаются реализовать его с помощью другого потока или асинхронной задачи. Надеюсь, с хорошими новостями :)

+2

ли вы добавить '<использует-разрешение андроида: name = "android.permission.INTERNET" /> 'на ваш AndroidManifest.xml? Кроме того, можете ли вы распечатать 'i.toString()' в этом блоке 'catch'? – pelya

+0

pelya, У меня есть оператор разрешения, и я просто добавил i.toString(). Результатом i.toString() является: 2! Android.os.NetworkOnMainThreadException –

ответ

0

Как вы сказали Существует NetworkOnMainThread исключение вам просто нужно поставить этот вопрос на новый поток и запустить его ...

Thread thread = new Thread() { 
    @Override 
    public void run() { 
Toast.makeText(this, "RIGHT BEFORE TRY", Toast.LENGTH_LONG).show(); 

    DatagramSocket socket; 
    DatagramPacket packet; 


    try { 
     Toast.makeText(this, "IN THE TRY", Toast.LENGTH _LONG).show(); 
     socket = new DatagramSocket(9750); 
     byte[] buf = new byte[1024]; //buffer 
     socket.setSoTimeout(100000); 
     Toast.makeText(this, "Timeout is: " + socket.getSoTimeout(), Toast.LENGTH_LONG).show(); 
     //DatagramPacket packet = new DatagaramPacket(buf, buf.length); 
     //Toast.makeText(this, "PACKET SIZE IS: "+buf.length, Toast.LENGTH_LONG).show(); 

     // while(true) { 
     Toast.makeText(this, "IN THE WILD!", Toast.LENGTH_LONG).show(); 
     packet = new DatagramPacket(buf, buf.length); 
     Toast.makeText(this, "PACKET SIZE IS: " + buf.length, Toast.LENGTH_LONG).show(); 

     try { 
      //socket.receive(packet); 
      socket.receive(packet); 
      Toast.makeText(this, "GOT SOMETHING!", Toast.LENGTH_LONG).show(); 
     } 
     catch (Exception i) { 
      // TODO Auto-generated catch block 
      //i.printStackTrace(); 
      Toast.makeText(this, "DIDN'T GET IT HERE EITHER!", Toast.LENGTH_LONG).show(); 
     } 
     //byte[] result = new byte[packet.getLength()]; 
     byte[] result = packet.getData(); 
     System.arraycopy(packet.getData(), 0, result, 0, packet.getLength()); 
     String msg = new String(result); 
     Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); 
     Toast.makeText(this, "END WHILE!", Toast.LENGTH_LONG).show(); 
     //} 

    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     //e.printStackTrace(); 
     Toast.makeText(this, "DIDN'T GET IT!", Toast.LENGTH_LONG).show(); 

    } 


    } 
}; 
thread.start(); 
+0

Ekant Sharma, изначально попробовал это без функции таймаута, так как понял, что он по умолчанию бесконечен, но он все еще не работает, поэтому я добавил, что играть с ним. –

Смежные вопросы