Отправка UDP-пакета в Kotlin
Отправка начинается с текста на английском и массива
байтов. Конструктор DatagramPacket принимает
данные, их длину, InetAddress хоста и номер
порта. Хост 127.0.0.1 указывает на ту же
машину, где запущена программа.
Метод send у DatagramSocket
передаёт пакет в сеть. Порт назначения берут у
сокета-приёмника после его запуска. Полный пример
с потоком-слушателем выглядит так:
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)
}
}.start()
ready.await()
DatagramSocket().use { socket ->
val data = "ping".toByteArray()
val packet = DatagramPacket(
data,
data.size,
InetAddress.getByName("127.0.0.1"),
port,
)
socket.send(packet)
}
}
Другой текст кладут в тот же каркас - меняют только
строку перед toByteArray. Длина в пакете
должна совпадать с размером массива:
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)
}
}.start()
ready.await()
DatagramSocket().use { socket ->
val data = "order 42".toByteArray()
val packet = DatagramPacket(
data,
data.size,
InetAddress.getByName("127.0.0.1"),
port,
)
socket.send(packet)
println(data.size)
}
}
Отправьте на localhost пакет с текстом
"lab send". Приёмник пусть выведет
полученную строку в консоль.
Отправьте два пакета подряд с текстами
"first" и "second" на один
порт. Приёмник напечатает обе строки по порядку.