Android nunca recibe paquetes UDP
El siguiente código da como resultado un tiempo de espera.
Funciona bien en Java no-Android. ¿Qué pasa?
- Dirección de difusión de Android
- tengo dos aplicaciones android, se puede enviar la cadena a través de LAN en IP específico y otra aplicación para la recepción, pero quiero transmitir la cadena a través de LAN?
- Recibir mensaje de difusión en Android
- Perforación UDP en Android; Servidor UDP
- Obtener la dirección de difusión wifi en Android wifi hotspot
//@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>
- Emulador de Android udp broadcast
- Difusión de audio / vídeo desde android vía udp a wifi y escuchar con vlc
- ¿Por qué no podemos enviar un paquete UDP desde un emulador de Android?
- ¿Fuerza el androide para enviar paquetes UDP inmediatamente?
- Recibe UDP en Android Marshmallow
- No se pueden recibir paquetes UDP adecuados mediante SSDP
- UDP Video Streaming en Android
- Datagram Transport Layer Security (DTLS) en Android / Java
¿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 ()? …
- Android – Ejecutar en segundo plano – Service vs. standard java class
- Cómo restringir EditText a sólo los caracteres especificados en android?