Сервер на ПК:Android приложение не получает пакеты UDP
sendData = "server msg here".getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData,
sendData.length, ipAddr, portNb);
try {
sendSock.send(sendPacket);
Thread.sleep(1000);
System.out.println("sent msg");
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
Поля ipAddr
и portNb
ARE NOT NULL. В андроида приложения нить работает:
sendSocket = new DatagramSocket();
sendSocket.setSoTimeout(3000);
sendSocket.setReuseAddress(true);
//...
try {
receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
System.out.println("droid now is "
+ new String(receivePacket.getData()));
} catch (IOException e) {
e.printStackTrace();
}
Я использую 57111 порт с обеих сторон, и я перенаправили его на Android эмулятор на тот же порт.
В Android у меня жестко закодирован IP-адрес моего компьютера, а на стороне сервера я попробовал 10.0.2.2, 10.0.2.15, а также IP-адрес, полученный с использованием метода второго ответа на вопрос this ,
Я поставил тайм-аут на Android стороне для сокета и трассировки:
`02-27 23:12:57.907: W/System.err(13993): java.net.SocketTimeoutException: Try again
02-27 23:12:57.907: W/System.err(13993): at org.apache.harmony.luni.platform.OSNetworkSystem.recv(Native Method)
02-27 23:12:57.917: W/System.err(13993): at dalvik.system.BlockGuard$WrappedNetworkSystem.recv(BlockGuard.java:321)
02-27 23:12:57.927: W/System.err(13993): at org.apache.harmony.luni.net.PlainDatagramSocketImpl.doRecv(PlainDatagramSocketImpl.java:172)
02-27 23:12:57.927: W/System.err(13993): at org.apache.harmony.luni.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:181)
02-27 23:12:57.927: W/System.err(13993): at java.net.DatagramSocket.receive(DatagramSocket.java:402)
02-27 23:12:57.938: W/System.err(13993): at com.example.testinger.ReceiveThread.run(ReceiveThread.java:39)
02-27 23:12:58.987: W/KeyCharacterMap(13993): No keyboard for id 0
02-27 23:12:58.987: W/KeyCharacterMap(13993): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
02-27 23:12:59.377: W/IInputConnectionWrapper(13993): showStatusIcon on inactive InputConnection
02-27 23:13:00.947: W/System.err(13993): java.net.SocketTimeoutException: Try again
02-27 23:13:01.057: W/System.err(13993): at org.apache.harmony.luni.platform.OSNetworkSystem.recv(Native Method) `
Я также попробовал его на экране телефона и результаты одинаковы. На стороне Android сообщения не поступают, метод приема ждет, пока он не истечет. Он имеет разрешения
- android.permission.INTERNET
- android.permission.ACCESS_NETWORK_STATE
- android.permission.ACCESS_WIFI_STATE
- android.permission.CHANGE_WIFI_MULTICAST_STATE
UPDATE: Я попробовал простую программу send-receive, и это тоже не сработало: client ждет пакет от server перед отображением.
Так что эмулятор использует 10.0.2.2 в качестве адреса сервера? Более того, для реального Android-устройства IP-сервер обычно похож на 192.168. *. * - поэтому вам понадобятся разные конфигурации для эмулятора и вашего устройства. Вы это учитывали? – cyroxx
Я не уверен в том, что проблема с эмулятором может быть проблемой, но поскольку я жестко закодировал каждый ip, я мог бы думать о сервере на компьютере. Я не думаю, что это проблема. –
Ну, [согласно документам] (http://developer.android.com/tools/devices/emulator.html#emulatornetworking) IP-эмулятор должен быть 10.0.2.15, но, очевидно, вы уже пробовали это. Может быть, глупый вопрос, но я предполагаю, что и сервер, и эмулятор работают на одной машине? – cyroxx