Android никогда не получает пакет UDP

Ниже кода приводит к тайм-ауту.

Это хорошо работает на Java не-Android.В чем дело?

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

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

5
задан WilliamKF 24 April 2014 в 01:25
поделиться

3 ответа

Вы тестируете это на эмуляторе или на фактическом телефоне? Если вы используете эмулятор, вам нужно знать , как работает сеть на эмуляторе . Наиболее конкретно:

каждый экземпляр эмулятора проходит за виртуальной службой маршрутизатора / брандмауэра, которая выделяет ее из сетевых интерфейсов и настроек машины вашего развития и из Интернета. Эмулируемое устройство не может видеть вашу машину для разработки или других экземпляров эмулятора в сети. Вместо этого он видит только то, что он подключен через Ethernet до маршрутизатора / брандмауэра.

, вероятно, вам нужно будет настроить переадресацию портов, либо , используя консоль эмулятора или , используя команду ADB .

7
ответ дан 13 December 2019 в 22:08
поделиться
byte[] buf = new byte[256];
socket = new DatagramSocket(port);
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);

Выше сработало для меня ... Ваш буфер кажется большим?


может быть немного далеко, но от чего вы пытаетесь получить?

Если вы пытаетесь общаться с помощью машины XP, у которой есть две сетевые карты (можно проводить и другие беспроводные, любые смеси), и вы используете XP, встроенный в брандмауэре?

Тогда запросы UDP прослушиваются только в первой сети на компьютере, отключаются другие сетевые карты в вашей системе, только позволили тому, чтобы вы пытались разговаривать свое устройство Android.

1
ответ дан 13 December 2019 в 22:08
поделиться

УДП работает нормально. Я не думаю, что ваш сервер отправляет ответ, потому что ваш исходящий пакет не содержит байтов, которые вы считаете, который он содержит.

См. Мои комментарии в поднятой вами ошибке Android ( http://code.google.com/p / android/issues/detail?id=6163 ).

2
ответ дан 13 December 2019 в 22:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: