Приём UDP-пакета в Kotlin
Приёмник создаёт буфер фиксированного размера и
оборачивает его в DatagramPacket. Вызов
receive ждёт первый пакет и заполняет
буфер. Реальная длина лежит в поле length -
по ней строят строку из data, а не по
всему массиву.
Строку получают через String с началом
0 и длиной пакета. После приёма текст
можно напечатать или обработать дальше:
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 = "note".toByteArray()
val packet = DatagramPacket(
data,
data.size,
InetAddress.getByName("127.0.0.1"),
port,
)
socket.send(packet)
}
}
Размер буфера задают с запасом: лишние байты в
строку не попадут, если указать length.
Тот же приёмник подходит для более длинного текста,
когда он помещается в буфер:
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(512)
val packet = DatagramPacket(buf, buf.size)
socket.receive(packet)
val text = String(
packet.data,
0,
packet.length,
)
println(text.length)
}
}.start()
ready.await()
DatagramSocket().use { socket ->
val data = "status ok".toByteArray()
val packet = DatagramPacket(
data,
data.size,
InetAddress.getByName("127.0.0.1"),
port,
)
socket.send(packet)
}
}
Примите один пакет с текстом "ready" и
выведите его в консоль одной строкой.
После приёма текста "metric" выведите
число символов в полученной строке.