Несколько сообщений в Kotlin
Одно TCP-соединение может передать несколько строк
подряд: каждая заканчивается переводом строки, как
при одиночной отправке. Сервер читает в цикле, пока
readLine возвращает текст.
Когда клиент закончил писать, поток вывода сокета
закрывают - сервер получит null и поймет,
что новых строк не будет. Три строки отправляют в
цикле, затем закрывают writer на клиенте:
import java.net.ServerSocket
import java.net.Socket
fun main() {
ServerSocket(0).use { server ->
val port = server.localPort
Thread {
server.accept().use { peer ->
peer.getInputStream().bufferedReader()
.use { input ->
peer.getOutputStream()
.bufferedWriter().use { output ->
while (true) {
val line = input.readLine()
?: break
output.write("ack: $line")
output.newLine()
output.flush()
}
}
}
}
}.start()
Socket("localhost", port).use { client ->
client.getOutputStream().bufferedWriter()
.use { output ->
client.getInputStream().bufferedReader()
.use { input ->
val lines = listOf(
"one",
"two",
"three",
)
for (line in lines) {
output.write(line)
output.newLine()
output.flush()
}
output.close()
repeat(3) {
println(input.readLine())
}
}
}
}
}
}
Клиент читает три ответа ack: ... после
закрытия записи. Сервер отвечает на каждую строку
отдельно, пока поток ввода не оборвется:
import java.net.ServerSocket
import java.net.Socket
fun main() {
ServerSocket(0).use { server ->
val port = server.localPort
Thread {
server.accept().use { peer ->
peer.getInputStream().bufferedReader()
.use { input ->
var count = 0
while (true) {
val line = input.readLine()
?: break
count++
println("line $count: $line")
}
}
}
}.start()
Socket("localhost", port).use { client ->
client.getOutputStream().bufferedWriter()
.use { output ->
repeat(3) { index ->
output.write("part-$index")
output.newLine()
output.flush()
}
output.close()
}
}
}
}
Три строки "a", "b", "c"
уходят с клиента; сервер печатает каждую с
префиксом "item: ", затем клиент
закрывает запись.
Клиент после трёх строк "n1", "n2",
"n3" читает три ответа "got n1",
"got n2", "got n3" и выводит их
в консоль.