2010-10-22 111 views
3

我在Android上有一个服务,用于监听并响应它通过多播接收到的数据包。Android多播套接字停止侦听

这在大多数情况下都能正常工作,但不幸的是,我发现每隔一段时间它就会停止接收数据包。该线程在对MulticastSocket.receive()的调用中保持阻塞状态,但没有任何结果。我一直在试图找出触发此事的原因,并且发现无线关闭和重新打开无线连接或更改无线连接都可以实现。

为了成功地继续侦听我的数据包,我需要关闭MulticastSocket并重新创建它。但是,我还没有找到任何方法来做这件事---我似乎没有得到任何事情发生的通知:没有意图,没有Java异常,什么都没有。如果套接字变得无效,我希望receive会抛出一个IOException,但这似乎没有发生。

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

回答

2

我认为变化的无线网络是非常类似于禁用和重新启用网络(可能用不同的IP和路由),所以不会让事情突然中断。

也许注册网络信息的变化会给你所需的警告?

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

和相关网页

+2

是的,它做到了。但是,事实证明,当连接消失时,您的多点传送锁被破坏(长时间延迟是我在重新编写代码之前三次重新编写代码)。所以,每次连接回来时都必须重新获取锁。 – 2010-10-26 11:04:12

2

您是否正在获取组播锁?

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

它似乎也像某些设备阻止组播:

Multicast on Android 2.2

+0

是的,我获得锁,我已经验证了我的设备真正实现多播。 – 2010-10-22 15:33:07