问题描述
Android 上的 MulticastSocket 似乎有一个小问题:编写与 SSDP 相关的应用程序。当我第一次设置所有东西时,套接字工作得很好,但是当我停止发现并尝试重新启动时,我只会得到一个 SocketException: Socket Closed。我没有关闭套接字,我只是停止负责在循环中调用 socket.receive()
的 Kotlin 协程。示例:
fun listenForPackets(): Flow<DatagramPacket> {
return flow {
multicastSocket.use {
val incomingBuffer = ByteArray(MULTICAST_DATAGRAM_SIZE)
while (true) {
val incomingPacket = DatagramPacket(incomingBuffer,incomingBuffer.size)
it.receive(incomingPacket)
emit(incomingPacket)
incomingPacket.length = incomingBuffer.size
}
}
}
}
问题
所以问题是当我再次尝试调用该函数时,我得到一个 SocketException: Socket Closed。套接字初始化代码运行一次,这意味着打开/关闭发现将多次使用同一个套接字;以下代码在整个应用程序中运行一次:
multicastSocket = MulticastSocket(MULTICAST_PORT)
multicastSocket.reuseAddress = true
multicastSocket.joinGroup(multicastGroup)
multicastLock.acquire()
我尝试了什么
我的第一个想法是我没有正确取消 Kotlin 协程。结果,我转而使用典型的 Java 线程,但无济于事。第一次启动线程有效,但是,重新启动发现会产生同样的问题。我也试过不离开组,并保持多播锁获得 - 同样的问题。
什么有效
每次我需要开始扫描时都运行初始化代码(我在其中分配套接字、加入组和获取锁)。在扫描结束时,我重置了所有变量(离开组、释放锁、关闭套接字)。所以我的问题变成了 - 这是正确的方法吗?还是我只是做错了什么?
再次重申,我发现数据包很好,问题在于重新启动发现。在此先感谢您的帮助!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)