Ниже кода приводит к тайм-ауту.
Это хорошо работает на 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>
Вы тестируете это на эмуляторе или на фактическом телефоне? Если вы используете эмулятор, вам нужно знать , как работает сеть на эмуляторе . Наиболее конкретно:
каждый экземпляр эмулятора проходит за виртуальной службой маршрутизатора / брандмауэра, которая выделяет ее из сетевых интерфейсов и настроек машины вашего развития и из Интернета. Эмулируемое устройство не может видеть вашу машину для разработки или других экземпляров эмулятора в сети. Вместо этого он видит только то, что он подключен через Ethernet до маршрутизатора / брандмауэра.
, вероятно, вам нужно будет настроить переадресацию портов, либо , используя консоль эмулятора или , используя команду ADB
.
byte[] buf = new byte[256];
socket = new DatagramSocket(port);
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
Выше сработало для меня ... Ваш буфер кажется большим?
может быть немного далеко, но от чего вы пытаетесь получить?
Если вы пытаетесь общаться с помощью машины XP, у которой есть две сетевые карты (можно проводить и другие беспроводные, любые смеси), и вы используете XP, встроенный в брандмауэре?
Тогда запросы UDP прослушиваются только в первой сети на компьютере, отключаются другие сетевые карты в вашей системе, только позволили тому, чтобы вы пытались разговаривать свое устройство Android.
УДП работает нормально. Я не думаю, что ваш сервер отправляет ответ, потому что ваш исходящий пакет не содержит байтов, которые вы считаете, который он содержит.
См. Мои комментарии в поднятой вами ошибке Android ( http://code.google.com/p / android/issues/detail?id=6163 ).