java - studio - Android nunca recibe paquetes UDP
udp android studio (4)
UDP funciona bien. No creo que su servidor esté enviando una respuesta porque su paquete de salida no contiene los bytes que cree que contiene.
mira mis comentarios en el error de Android que has planteado ( http://code.google.com/p/android/issues/detail?id=6163 ).
El código a continuación da como resultado un tiempo de espera.
Funciona bien en Java que no es de 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
}
Android manifiesto:
<?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>
Para enviar / difundir 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 captar la transmisión, incluso cuando se ejecuta en el mismo contexto. Me pregunto si hay otro permiso para socket.receive ()? ...
byte[] buf = new byte[256];
socket = new DatagramSocket(port);
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
Arriba funcionó para mí ... ¿Tu memoria intermedia parece grande?
Puede ser un poco descabellado, pero ¿de qué estás tratando de recibir?
Si está tratando de comunicarse con una máquina XP que tiene dos tarjetas de red (una puede estar conectada y la otra inalámbrica, cualquier combinación) y está usando XP integrado en un firewall?
Entonces, las solicitudes UDP solo se escuchan en la primera red de la computadora, deshabilitan otras tarjetas de red en su sistema, solo han habilitado la que está tratando de usar para hablar con su dispositivo Android.
¿Estás probando esto en el emulador o en un teléfono real? Si está utilizando un emulador, debe saber 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 enrutador virtual / servicio de firewall 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, solo ve que está conectado a través de Ethernet a un enrutador / firewall.
Probablemente necesites configurar el reenvío de puertos, ya sea usando la consola Emulator o usando el comando adb
.