Несколько 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". Отправитель выведет три строки
ответа.