我正在编写一个通过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);
}
}
}
答案 0 :(得分:0)
似乎Android中的多播支持并不像某些使用可能希望的那样稳固。见http://codeisland.org/2012/udp-multicast-on-android/
即它是否实际可用或可能依赖于设备。它不适用于我的Nexus5。
Android上有多个与多播支持相关的错误,但我怀疑你对https://code.google.com/p/android/issues/detail?id=1698
犯规答案 1 :(得分:0)
如果您可以检测到wifi何时下降,我会建议离开并重新加入该组,而不是关闭并重新打开套接字。