2

サーバーは 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();
}

フィールドipAddrportNbはヌルではありません。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

更新:単純な送受信プログラムを試しましたが、どちらも機能しませんでした。クライアントは、表示される前にサーバーからのパケットを待機します。

4

1 に答える 1

0

デバイスからサーバーまたはポートに到達できないようです。マシンで HTTP サーバーを実行している場合は、ブラウザーを使用して同じことをテストできます。

または、コードを使用することもできます - 以下を参照してください - Android: サーバーが利用可能かどうかを確認するには? リモート システムが到達可能かどうかをテストする方法

于 2013-02-27T21:56:08.920 に答える