Введение в UDP в Kotlin
Протокол UDP передает отдельные датаграммы - блоки
байтов с адресом получателя. Соединение заранее не
открывают: каждый пакет несет хост и порт назначения.
На JVM для этого служат DatagramSocket и
DatagramPacket из пакета java.net.
Приёмник слушает свободный порт: сокет создают с
номером 0, система выдает значение через
localPort. Отправитель шлёт текст на
127.0.0.1 и этот порт. Текст кладут в
массив байтов через toByteArray, на приёме
собирают строку из прочитанной длины. Оба конца
удобно держать в одном main: приёмник в
отдельном потоке, сокеты закрывают через use:
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()
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 data = "hello udp".toByteArray()
val packet = DatagramPacket(
data,
data.size,
InetAddress.getByName("127.0.0.1"),
port,
)
socket.send(packet)
}
}
В консоли приёмника появится строка hello udp.
Такой одноразовый обмен показывает суть UDP: один
пакет - один адрес, без рукопожатия как у TCP.