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

如果您可以检测到 wifi 何时关闭和打开,我建议您离开并重新加入该组,而不是关闭并重新打开套接字。

于 2014-01-27T03:47:14.273 回答
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 回答