是什么导致多播消息在wifi重启后无法立即流动



我有一个Android应用程序,它可以创建MulticastSocket,加入MC组,并在本地wifi网络上接收来自另一台机器的消息。

MulticastSocket socket = new MulticastSocket(null); // Create an unbound socket.
socket.setSoTimeout(LISTEN_TIMEOUT_MILLIS);
socket.setReuseAddress(true);
socket.bind(new InetSocketAddress(listenPort)); // Bind to the configured multicast port
final WifiManager.MulticastLock lock = wifiManager.createMulticastLock("my_lock");
lock.acquire();
socket.setNetworkInterface(networkInterface);
socket.joinGroup(multicastGroup);
while (true) {
socket.receive(packet);
// Do something with the packet
// Handle timeout etc.
// Handle change of network interface by leaving group, setting netIntf and joining group again.
}
socket.leaveGroup(multicastGroup);
socket.close();
lock.release();

在大多数安卓设备(华为、三星)上运行良好,但在一些设备(Pixel3)上,如果设备上的WiFi关闭,然后重新打开,而应用程序看到WiFi连接生效,则可能需要长达14分钟(变化很大)才能再次收到MC消息。

即使扔掉Socket并创建一个新的MCSocket也不能减轻延迟。

但它必须是JVM中的某种状态,因为应用程序的重新启动会导致它立即连接。

感觉好像有一些MC连接的租约正在保留,而这些租约只是在一个时钟周期内续签的。

所以我的问题是:

  1. 是什么导致MC消息不能在WiFi连接恢复,并创建了一个新的MCSocket听我说
  2. 我能做些什么来确保及时恢复消息流

我注意到您已将问题更新为包含WifiManager.MulticastLock

我想知道当Wifi连接恢复时,你是否正在重新获取锁,SO上的一些帖子暗示这是必要的。

我注意到对以下帖子的评论:

回复:https://stackoverflow.com/a/4002084/1015289

事实证明,当连接断开时,您的多播锁会被破坏(在我发现这一点之前,长时间的延迟让我重写了三次代码)。因此,每次连接返回时,您都必须重新获取锁定

相关内容

  • 没有找到相关文章

最新更新