android - Android MulticastSocket 隐式关闭
问题描述
我似乎对 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 线程,但无济于事。第一次启动线程是可行的,但是重新启动发现会产生同样的问题。我也尝试过不离开组,并保持获得 multicastLock - 同样的问题。
什么有效
有效的方法是让初始化代码(我在其中分配套接字、加入组并获取锁)在我每次需要开始扫描时运行。在扫描结束时,我重置了所有变量(离开组、释放锁、关闭套接字)。所以我的问题变成了 - 这是正确的方法吗?还是我只是做错了什么?
只是为了重新迭代,我发现数据包很好,问题在于重新启动发现。预先感谢您的任何帮助!
解决方案
推荐阅读
- html - 带圆角的可滚动表格
- c# - 使用 Lambda 表达式删除 Mongo 文档,c#
- javascript - 升级不在 package.json 中的包
- python - 如何编写一个类构造函数,分别接受值列表和每个值
- r - 按日期索引行并在 R 中包含重复的日期
- c# - 如果我的 C# 应用程序关闭,SQL 更新命令会完成吗?
- php - 在 WooCommerce 中更新与订单相关的地址字段
- asp.net-core - 在 Web 表单中使用占位符值作为密码
- swift - 将python中的会话令牌转换为swift缺少什么?
- powershell - Powershell - 我如何处理这种类型的下拉