Как использовать Ktor BoundDatagramSocket для прослушивания входящего трафика udp - PullRequest
0 голосов
/ 24 июня 2019

Я использую ktor для приложения kotlin / native.В настоящее время я тестирую вещи на стороне Android, и поэтому у меня есть код прямо в viewmodel.Приложению необходимо прослушивать входящие датаграммы udp, но оно, похоже, ничего не получает.Что я делаю неправильно в своей реализации?

Как я слушаю входящие данные во время тестирования:

viewModelScope.launch(Dispatchers.IO) {
            aSocket(ActorSelectorManager(Dispatchers.IO)).udp()
                .bind(InetSocketAddress("localhost", 40779))
                .use { udpSocket ->
                    Log.d("hereUDP", udpSocket.localAddress.toString())
                    try {
                        while (!udpSocket.isClosed) {
                            val datagram = udpSocket.receive()
                            Log.d("hereUDP", "received")
                            val line = datagram.packet.readText()
                            Log.d("hereUDP", line)

                            if (line.toLowerCase() == "q")
                                udpSocket.close()
                        }
                        Log.d("hereUDP", "closed")
                    } catch (e:Throwable){
                        Log.d("hereUDP", "something went wrong", e)
                        udpSocket.close()
                    }
                }
        }

Код, который я действительно хотел получить:

coroutineScope {
            launch(Dispatchers.IO + socket!!.socketContext) {
                socket?.incoming
                    ?.consumeEach {
                        val data = it.packet.readBytes()
                        val address = it.address as InetSocketAddress
                        listener?.onReceive(data, HostEndpoint(address.hostName))
                    }
            }
        }

Что я делал в своем терминале:

➜  platform-tools nc -u -c 192.168.1.130 40779
bla
bla
^C
...