Android nunca recibe paquetes UDP

El siguiente código da como resultado un tiempo de espera.

Funciona bien en Java no-Android. ¿Qué pasa?

//@Override public static void run() { //System.out.println ( "Local Machine IP : "+addrStr.toString ( ) ) ; HelloWorldActivity.tv.setText("Trace 1"); try { // Retrieve the ServerName InetAddress serverAddr; //= InetAddress.getByName(Server.SERVERIP); InetAddress ias[] = InetAddress.getAllByName(Server.SERVERNAME); serverAddr = ias[0]; Log.d("UDP", "C: Connecting..."); /* Create new UDP-Socket */ DatagramSocket socket = new DatagramSocket(); /* Prepare some data to be sent. */ String strQuery="ÿÿÿÿgetservers"+" "+Server.iProtocol+" "+"'all'"; Log.d("UDP", strQuery); //byte[] buf = ("ÿÿÿÿgetservers 68 'all'").getBytes(); byte[] buf = strQuery.getBytes(); /* Create UDP-packet with * data & destination(url+port) */ DatagramPacket packet = new DatagramPacket(buf, buf.length, serverAddr, Server.SERVERPORT); Log.d("UDP", "C: Sending: '" + new String(buf) + "'"); /* Send out the packet */ socket.setSoTimeout(5000); socket.send(packet); Log.d("UDP", "C: Sent."); Log.d("UDP", "C: Done."); // http://code.google.com/p/android/issues/detail?id=2917 byte[] buffer= new byte[1024*100]; DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length); //, serverAddr, Server.SERVERPORT); socket.receive(receivePacket); HelloWorldActivity.tv.setText("TTT"); String x = new String(receivePacket.getData()); Log.d("UDP", "C: Received: '" + x + "'"); HelloWorldActivity.tv.setText(x); } catch (Exception e) { HelloWorldActivity.tv.setText(e.getMessage()); Log.e("UDP", "C: Error", e); } } public class Server { /* //public static java.lang.string SERVERIP; public static String SERVERNAME = "monster.idsoftware.com"; public static String SERVERIP = "192.246.40.56"; public static int SERVERPORT = 27950; public static int PROTOCOL = 68; */ //public static String SERVERNAME="monster.idsoftware.com"; public static String SERVERNAME="dpmaster.deathmask.net"; public static String SERVERIP="192.246.40.56"; public static int SERVERPORT=27950; //public static int iProtocol= 68; // Quake3 public static int iProtocol=71; // OpenArena } 

Manifiesto de Android:

 <?xml version="1.0" encoding="utf-8"?> 

 <use-permission id="android.permission.READ_CONTACTS" /> <use-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_GPS" /> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" /> <uses-permission android:name="android.permission.ACCESS_CELL_ID" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <application android:icon="@drawable/icon" android:label="AAA New Application" > <activity android:name="HelloWorldActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> 

¿Está probando esto en el emulador o en un teléfono real? Si está utilizando un emulador, debe tener en cuenta cómo funciona la conexión en red en el emulador . Más específicamente:

Cada instancia del emulador se ejecuta detrás de un servicio de enrutador / cortafuegos virtual que lo aísla de las interfaces y configuraciones de red de su máquina de desarrollo y de Internet. Un dispositivo emulado no puede ver su máquina de desarrollo u otras instancias de emulador en la red. En cambio, sólo ve que está conectado a través de Ethernet a un enrutador / firewall.

Es probable que necesite configurar el reenvío de puertos, ya sea utilizando la consola Emulator o utilizando el comando adb .

UDP funciona bien. No creo que su servidor está enviando una respuesta porque su paquete saliente no contiene los bytes que cree que contiene.

Vea mis comentarios en el error de Android que usted planteó ( http://code.google.com/p/android/issues/detail?id=6163 ).

 byte[] buf = new byte[256]; socket = new DatagramSocket(port); DatagramPacket packet = new DatagramPacket(buf, buf.length); socket.receive(packet); 

Arriba trabajado para mí … ¿Su parachoques parece grande?


Podría ser un poco extravagante, pero ¿qué estás tratando de recibir de?

Si usted está tratando de comunicarse con una máquina XP que tiene dos tarjetas de red (uno podría ser cableado y el otro inalámbrico, cualquier mezcla) y que está utilizando XP construido en el cortafuegos?

A continuación, las solicitudes UDP sólo se escuchan en la primera red en el equipo, deshabilitar otras tarjetas de red en su sistema, sólo han habilitado la que su tratar de hablar de su dispositivo Android.

Para enviar / emitir UDP usando socket.send (), necesita el permiso de Android:

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

Sin embargo, aun así, socket.receive () no parece atrapar la emisión, incluso cuando se ejecuta en el mismo contexto. ¿Me pregunto si hay otro permiso para socket.receive ()? …

  • Problema con DatagramSocket en Android 7.1.1
  • ¿Tiene sentido tener más de un socket UDP Datagram en espera? ¿Los paquetes "simultáneos" han sido eliminados o puestos en cola por el núcleo?
  • Android illegalxception
  • Unicast UDP de Android funciona, pero la difusión no
  • ¿Android 4.x soporta streaming RTSP sobre TCP?
  • Uso de vlclib en Android
  • No se pueden enviar paquetes UDP de la máquina de desarrollo a Android Emulator
  • Comunicación UDP de Android
  • ¿Problemas con el uso de TCP y UDP en la misma aplicación?
  • No se puede establecer el valor DSCP en la aplicación android
  • Envío de DatagramPacket sin conexión a Internet - Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.