2

ある時点でマルチキャスト メッセージを送信する Android アプリを開発しています。これまでのところ、エミュレータデバイスでこれを実行しています。

同じマシンに、マルチキャスト メッセージを期待しているサーバー (Android ではなく、プレーンな Java アプリ) がありますが、それを取得することはありません。サーバーを起動するときは、サーバーがローカル マシン上にあるため、ループバック インターフェイス ( 127.0.0.1) から起動します。私はこれを通常の Java アプリで行ったことがあり、完全に機能すると言わざるを得ません。

Android アプリのコードは次のとおりです。

try {
    InetAddress group = InetAddress.getByName(MULTICAST_HOST);
    byte[] data = DISCOVER_MESSAGE.getBytes();
    DatagramSocket ds = new DatagramSocket();
    ds.setSoTimeout(60000);
    DatagramPacket dp = new DatagramPacket(data, data.length, group, TcpipSIBDiscoverer.PORT);

    ds.send(dp);
    byte[] buf = new byte[1024];
    dp = new DatagramPacket(buf, buf.length);
    ds.receive(dp);
    if (dp.getLength() > 0) {
        byte[] tmp = new byte[dp.getLength()];
        System.arraycopy(dp.getData(), 0, tmp, 0, tmp.length);
        String received = new String(tmp);
        Logger.debug(this, "Received from SIB: " + received);
        SIBDescriptor sibDescriptor = createSIBDescriptor(received);

        this.discoveryListener.connectorSIBDiscovered(sibDescriptor);
    }
} catch (SocketTimeoutException e) {
    Logger.error("Socket time excedeed while waiting a response when discovering SIBs. Trying again");
} catch (IOException e) {
    Logger.error("There was some kind of IO error while waiting for a response when discovering SIBs. Trying again");
}

ご覧のとおり、 のDatagramSocket代わりに通常の を使用していMulticastSocketます。リッスン サーバーのアドレスは235.0.0.1:5555.

コードが機能していないのか、ループバック インターフェイスに実際に到達できるようにエミュレータ デバイスで何かを行う必要があるのか​​ よくわかりません...何かアイデアはありますか?

ありがとう!アレックス

4

1 に答える 1

0

Android の 127.0.0.1 は、デバイスのローカルホスト (またはエミュレーター) を指します。「ローカル マシン」の localhost に到達するには、10.0.2.2 を使用する必要があります。

これは多くのトピックで議論されています。

于 2013-03-04T11:03:54.980 に答える