首页 > 解决方案 > 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 - 同样的问题。

什么有效

有效的方法是让初始化代码(我在其中分配套接字、加入组并获取锁)在我每次需要开始扫描时运行。在扫描结束时,我重置了所有变量(离开组、释放锁、关闭套接字)。所以我的问题变成了 - 这是正确的方法吗?还是我只是做错了什么?

只是为了重新迭代,我发现数据包很好,问题在于重新启动发现。预先感谢您的任何帮助!

标签: androidsocketskotlinkotlin-coroutinesssdp

解决方案


推荐阅读