サーバーは PC 上にあります。
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
はヌルではありません。Android アプリケーションでは、スレッドが実行されます。
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 では、PC の IP アドレスをハードコーディングしました。サーバー側では、10.0.2.2、10.0.2.15、およびこの質問に対する 2 番目の回答の方法を使用して取得した IP アドレスを試しました。
ソケットの 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 側ではメッセージが届かず、 receive メソッドはタイムアウトになるまで待機します。権限があります
- android.permission.INTERNET
- android.permission.ACCESS_NETWORK_STATE
- android.permission.ACCESS_WIFI_STATE
- android.permission.CHANGE_WIFI_MULTICAST_STATE
更新:単純な送受信プログラムを試しましたが、どちらも機能しませんでした。クライアントは、表示される前にサーバーからのパケットを待機します。