Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗ktSpUdSev 289 of 299 menu
◀ ▶

Несколько UDP-пакетов в Kotlin

Один сокет может принять серию пакетов: после каждого receive буфер и объект DatagramPacket используют снова. На отправке цикл вызывает send для каждой строки - порядок на проводе обычно совпадает с порядком вызовов на localhost.

Приёмник в цикле читает три сообщения и печатает каждое. Отправитель шлёт их на один порт:

import java.net.DatagramPacket import java.net.DatagramSocket import java.net.InetAddress import java.util.concurrent.CountDownLatch fun main() { val ready = CountDownLatch(1) var port = 0 Thread { DatagramSocket(0).use { socket -> port = socket.localPort ready.countDown() repeat(3) { val buf = ByteArray(256) val packet = DatagramPacket(buf, buf.size) socket.receive(packet) val text = String( packet.data, 0, packet.length, ) println(text) } } }.start() ready.await() DatagramSocket().use { socket -> val host = InetAddress.getByName("127.0.0.1") for (word in listOf("one", "two", "three")) { val data = word.toByteArray() val packet = DatagramPacket( data, data.size, host, port, ) socket.send(packet) } } }

Ответ на каждый пакет тоже можно слать в цикле на address и port из соответствующего приёма. Отправитель тогда читает несколько ответов подряд:

import java.net.DatagramPacket import java.net.DatagramSocket import java.net.InetAddress import java.util.concurrent.CountDownLatch fun main() { val ready = CountDownLatch(1) var port = 0 Thread { DatagramSocket(0).use { socket -> port = socket.localPort ready.countDown() repeat(2) { val buf = ByteArray(256) val packet = DatagramPacket(buf, buf.size) socket.receive(packet) val tag = String( packet.data, 0, packet.length, ) val reply = "echo $tag".toByteArray() val out = DatagramPacket( reply, reply.size, packet.address, packet.port, ) socket.send(out) } } }.start() ready.await() DatagramSocket().use { socket -> val host = InetAddress.getByName("127.0.0.1") for (word in listOf("a", "b")) { val data = word.toByteArray() val packet = DatagramPacket( data, data.size, host, port, ) socket.send(packet) } repeat(2) { val buf = ByteArray(256) val answer = DatagramPacket(buf, buf.size) socket.receive(answer) println( String(answer.data, 0, answer.length), ) } } }

Отправьте пять пакетов с текстами "n1" … "n5". Приёмник выведет пять строк по одной на пакет.

Примите три запроса и на каждый ответьте "ok". Отправитель выведет три строки ответа.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить