Сервер сокета в Kotlin
Сервер создают через ServerSocket с номером
порта. Вызов accept блокирует поток, пока
клиент не подключится; он возвращает отдельный
Socket для обмена с этим клиентом. Его
тоже оборачивают в use.
Входящую строку читают readLine из
bufferedReader на потоке ввода сокета.
Ответ записывают в bufferedWriter на
потоке вывода и сразу сбрасывают буфер:
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 ->
val line = input.readLine()
output.write("echo: $line")
output.newLine()
output.flush()
}
}
}
}.start()
Socket("localhost", port).use { client ->
client.getOutputStream().bufferedWriter()
.use { output ->
client.getInputStream().bufferedReader()
.use { input ->
output.write("probe")
output.newLine()
output.flush()
input.readLine()
}
}
}
}
}
Прослушивание порта удобно вынести в фоновый поток,
чтобы в main осталось место для клиента.
Схема та же: ServerSocket(0), затем
accept, чтение одной строки и ответ:
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 ->
val line = input.readLine()
output.write("ok: $line")
output.newLine()
output.flush()
}
}
}
}.start()
Socket("localhost", port).use { client ->
client.getOutputStream().bufferedWriter()
.use { out ->
client.getInputStream().bufferedReader()
.use { inp ->
out.write("ready")
out.newLine()
out.flush()
println(inp.readLine())
}
}
}
}
}
После строки "ask" от клиента сервер
отвечает "answer: ask"; клиент выводит
эту строку в консоль.
Сервер возвращает клиенту текст "pong",
если получил "ping"; в консоли клиента
должно быть "pong".