【问题标题】:Android Multicast socket stops listeningAndroid 多播套接字停止侦听
【发布时间】:2011-04-29 05:34:59
【问题描述】:

我在 Android 上有一个服务,它侦听并响应它通过多播接收的数据包。

这在大多数情况下都有效,但不幸的是,我发现它会时不时地停止接收数据包。线程在调用 MulticastSocket.receive() 时保持阻塞,但没有任何结果。我一直在慢慢尝试找出是什么触发了这种情况,我发现关闭并重新打开无线,或更改无线连接即可。

为了成功继续监听我的数据包,我需要关闭 MulticastSocket 并重新创建它。但是,我还没有找到任何方法来执行此操作 --- 我似乎没有收到任何通知表明发生了什么事:没有意图,没有 Java 异常,什么都没有。如果套接字无效,我希望接收会抛出 IOException,但这似乎没有发生。

谁能提供关于 (a) 实际发生了什么以及 (b) 如何解决它的任何见解?现在我最好的猜测是每隔十秒左右不断地销毁和重新创建套接字,这简直是邪恶的。

【问题讨论】:

    标签: android sockets multicast multicastsocket


    【解决方案1】:

    注意:这个答案在 2010 年问这个问题时是有意义的,今天可能已经无关紧要了。

    我认为更改无线网络非常类似于禁用和重新启用网络(可能使用不同的 IP 和路由),因此出现故障也就不足为奇了。

    也许注册网络信息的更改会给您所需的警告?

    http://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION

    及相关页面

    【讨论】:

    • 是的,做到了。然而,事实证明,当连接消失时,您的多播锁定被破坏(长时间的延迟是我在弄清楚这一点之前重写了我的代码三遍)。因此,每次连接恢复时,您都必须重新获取锁。
    • 请注意,链接被一个错字破坏了 /androi/net 应该是 /android/net 根据完整链接:developer.android.com/reference/android/net/…
    【解决方案2】:

    您是否正在获取多播锁定?

    WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    MulticastLock lock = manager.createMulticastLock("lock name");
    lock.setReferenceCounted(true);
    lock.acquire();
    

    某些设备似乎也阻止了多播:

    Multicast on Android 2.2

    【讨论】:

    • 是的,我正在获取锁,并且我已经验证我的设备确实实现了多播。
    猜你喜欢
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2015-06-07
    • 2011-12-10
    • 1970-01-01
    相关资源
    最近更新 更多