3

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

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

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

任何人都可以就(a)实际发生的事情以及(b)如何解决它提供任何见解吗?现在我最好的猜测是每隔十秒左右不断地销毁和重新创建套接字,这只是邪恶的。

4

2 回答 2

3

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

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

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

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

和相关页面

于 2010-10-23T01:56:05.020 回答
2

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

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

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

Android 2.2 上的多播

于 2010-10-22T15:23:24.440 回答