我正在编写一个通过MulticastSocket进行通信的安卓应用程序。它基本上工作正常,但我遇到了一个奇怪的错误:只要连接中断并恢复(例如,设备短暂地失去WiFi连接),应用程序仍然可以发送,但不能接收任何东西。当其他设备发送数据包时,其他设备会收到数据包,但是当其他设备发送数据包时,该设备不会接收它们。
我已验证receiver Thread仍在运行。它被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);
}
}
}发布于 2014-01-27 11:18:07
看起来Android中的组播支持并不像一些用户希望的那样可靠。请参阅http://codeisland.org/2012/udp-multicast-on-android/
例如,它是否真的有效,或者可能取决于设备。它在我的Nexus5上不工作。
在Android上有许多与多播支持相关的but,但我怀疑你正在与https://code.google.com/p/android/issues/detail?id=1698发生冲突。
发布于 2014-01-27 11:47:14
如果你能检测到wifi何时起伏,我建议你离开并重新加入组,而不是关闭并重新打开插座。
https://stackoverflow.com/questions/19117991
复制相似问题