2010-01-20 4 views
5

Der folgende Code führt zu einem Timeout.Android empfängt kein UDP-Paket

Es funktioniert gut auf Nicht-Android-Java. Was ist los?

//@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 Manifest:

<?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> 

+0

Sind Sie sicher, dass Ihr Handy-Netzbetreiber uneingeschränkten eingehenden UDP-Verkehr erlaubt? – jarnbjo

+0

Wäre nicht in der Lage, Quake3 über Android (über USB) im Zug zu spielen, wenn das nicht so wäre. –

Antwort

7

testen Sie dies auf dem Emulator oder auf einem tatsächlichen Handy? Wenn Sie einen Emulator verwenden, müssen Sie auf how networking on the emulator works achten. Ganz speziell:

Jede Instanz des Emulators wird hinter einem virtuellen Router/Firewall-Dienst ausgeführt, der sie von den Netzwerkschnittstellen und Einstellungen Ihres Entwicklungscomputers und vom Internet trennt. Ein emuliertes Gerät kann Ihren Entwicklungscomputer oder andere Emulatorinstanzen im Netzwerk nicht sehen. Stattdessen sieht es nur, dass es über Ethernet mit einem Router/Firewall verbunden ist.

Sie müssen wahrscheinlich die Portweiterleitung einrichten, entweder using the Emulator console oder using the adb command.

+0

es schlägt auf dem tatsächlichen Gerät auch fehl ... es immer Timeouts, im Emulator sowie im eigentlichen Gerät. Es funktioniert gut auf der Entwicklungsmaschine in einer normalen Java-Umgebung. Und ich kann auf das Internet auf Android zugreifen ... –

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

Oben für mich gearbeitet ... Ihr Puffer scheint groß?


Vielleicht ein wenig weit hergeholt, aber was willst du erhalten?

Wenn Sie versuchen, mit einem XP-Computer zu kommunizieren, der zwei Netzwerkkarten hat (die eine kann verkabelt sein und die andere kabellos, jede Mischung) und Sie verwenden XP in der Firewall?

Dann werden UDP-Anfragen nur auf dem ersten Netzwerk auf dem Computer abgehört, deaktivieren Sie andere Netzwerkkarten auf Ihrem System, nur aktiviert haben, dass Sie versuchen, Ihr Android-Gerät zu sprechen.

+0

groß? 1024 * 100 = 100 kb. Das ist nicht viel. Ich versuchte auch auf Android direkt, nicht der Emulator, aber das gleiche Ergebnis dort. Ich werde es mit 256 Bytes versuchen. –

+0

Den Kommentar von jarnbjo notieren Der obige Beispielcode funktionierte mit meinem Gerät, das über WLAN verbunden war, nicht über das Mobilfunknetz. – optics

+0

Ich werde versuchen, wenn ich wieder zu Hause bin und WLAN –

2

UDP funktioniert gut. Ich glaube nicht, dass Ihr Server eine Antwort sendet, da Ihr ausgehendes Paket nicht die Bytes enthält, von denen Sie glauben, dass sie darin enthalten sind.

siehe meine Kommentare in der Android-Fehler, den Sie ausgelöst haben (http://code.google.com/p/android/issues/detail?id=6163).

+0

was ist, wenn sein Empfang aber während des konstanten Zuflusses von Paketen einige verpasst wird. Irgendeine Idee, um dieses Problem zu lösen –

0

senden/Broadcast-UDP socket.send(), müssen Sie die Android-Berechtigung:

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

Aber auch so, socket.receive() scheint nicht die Sendung zu fangen, auch wenn im selben Kontext laufen. Ich frage mich, ob es eine andere Erlaubnis für socket.receive() gibt? ...