gpt4 book ai didi

java - MulticastSocket 可以发送但不能接收

转载 作者:行者123 更新时间:2023-12-01 04:19:20 27 4
gpt4 key购买 nike

我正在编写一个通过 MulticastSocket 进行通信的 Android 应用程序。它基本上工作正常,但我遇到了一个奇怪的错误:每当连接中断并恢复时(例如设备短暂失去 WiFi 连接),应用程序仍然可以发送但不能接收任何内容。当发送数据包时,其他设备会收到数据包,但是当其他设备发送数据包时,该设备不会收到数据包。

我已经验证接收器线程仍然启动并运行。它卡在socket.receive 中。添加套接字超时没有帮助,它只是使接收超时而没有收到任何内容。

当我关闭并重新打开 MulticastSocket 时,一切都恢复正常。我已经注册了一个用于连接更改的广播接收器,它在连接丢失和恢复时重新连接。这稍微缓解了这个问题,但是当连接在另一个点中断时(例如重新启动服务器),它仍然会发生。

所以我要么需要修复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);
}
}
}

最佳答案

Android 中的多播支持似乎并不像某些用户希望的那样可靠。请参阅http://codeisland.org/2012/udp-multicast-on-android/

即它是否确实有效或者可能取决于设备。它无法在我的 Nexus5 上运行。

Android 上存在许多与多播支持相关的错误,但我怀疑您犯了https://code.google.com/p/android/issues/detail?id=1698 的错误。

关于java - MulticastSocket 可以发送但不能接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19117991/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com