Обмен строками в Kotlin
Полный цикл в одном процессе: фоновый поток ждет
accept, основной поток открывает
Socket на localhost и номер из
localPort. Сначала клиент пишет строку,
затем читает ответ - порядок важен, иначе стороны
ждут друг друга.
Ответ сервера попадает в консоль через
println на клиенте после readLine
на потоке ввода сокета:
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 ->
input.readLine()
output.write("status: done")
output.newLine()
output.flush()
}
}
}
}.start()
Socket("localhost", port).use { client ->
client.getOutputStream().bufferedWriter()
.use { output ->
client.getInputStream().bufferedReader()
.use { input ->
output.write("go")
output.newLine()
output.flush()
println(input.readLine())
}
}
}
}
}
Сервер может добавить к ответу прочитанный текст. Клиент печатает готовую строку целиком - так видно, что обмен завершился в рамках одного запуска:
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("heard: $line")
output.newLine()
output.flush()
}
}
}
}.start()
Socket("localhost", port).use { client ->
client.getOutputStream().bufferedWriter()
.use { output ->
client.getInputStream().bufferedReader()
.use { input ->
output.write("wave")
output.newLine()
output.flush()
println(input.readLine())
}
}
}
}
}
Клиент отправляет "start" и печатает
ответ "begin: start", который формирует
сервер.
В консоли клиента после обмена должна быть строка
"ok", если сервер получил "check".