1

MulticastSocket を介して通信する Android アプリを作成しています。基本的には正常に動作していますが、奇妙なバグに遭遇しました: 接続が中断されて復元された場合 (たとえば、デバイスの WiFi 接続が一時的に失われた場合) はいつでも、アプリは送信できますが、何も受信できません。他のデバイスがパケットを送信すると、パケットを受信しますが、他のデバイスがパケットを送信すると、デバイスはそれらを受信しません。

レシーバー スレッドがまだ稼働していることを確認しました。socket.receive でスタックしています。ソケット タイムアウトを追加しても効果はありませんでした。何も受信せずに受信がタイムアウトしただけです。

MulticastSocket を閉じて再度開くと、すべて正常に動作します。接続が失われて復元されたときに再接続を行う、接続の変更のために BroadcastReceiver を登録しました。これにより問題が少し軽減されますが、別の時点 (サーバーの再起動など) で接続が中断された場合にも問題が発生します。

そのため、socket.receive を修正するか、ソケットを閉じて再度開くために、ソケットがそれ以上パケットを受信できないときを確実に見つける必要があります。助言がありますか?

コード:

private MulticastSocket socket;

public void open() throws IOException {
    socket = new MulticastSocket(serverAddress.getPort());
    socket.joinGroup(serverAddress.getAddress());

    receiver = new Receiver();
    receiver.start();
}

private void send(MyPacket packet) throws IOException {
    if (socket == null)
        throw new IOException("Connection closed");

    DatagramPacket datagramPacket =
            new DatagramPacket(packet.getBuffer(), packet.getSize(), serverAddress);
    socket.send(datagramPacket);
}

private class Receiver extends Thread {
    @Override
    public void run() {
        while (!closing) {
            if (socket == null)
                return;

            try {
                socket.receive(packet);
            } catch (IOException e) {
                close("IOException in receiver thread", e);
                return;
            }

            onPacketReceived(packet);
        }
    }
}
4

2 に答える 2

0

Android でのマルチキャスト サポートは、一部のユーザーが期待するほどしっかりしていないようです。http://codeisland.org/2012/udp-multicast-on-android/を参照してください。

つまり、実際にうまくいくかどうか、またはデバイスに依存する可能性があるかどうかです。私の Nexus5 では動作しません。

Android でのマルチキャスト サポートに関連するバグは多数ありますが、https://code.google.com/p/android/issues/detail?id=1698に違反していると思われます。

于 2014-01-27T03:18:07.070 に答える
0

Wi-Fi がいつダウンしてアップするかを検出できる場合は、ソケットを閉じて再度開くのではなく、グループを離れて再度参加することをお勧めします。

于 2014-01-27T03:47:14.273 に答える