Клиент сокета в Kotlin
Клиентская сторона открывает соединение классом
Socket: первый аргумент - имя хоста,
второй - номер порта, на котором уже слушает
сервер. Объект Socket лучше оборачивать в
use, чтобы сокет закрылся после выхода из
блока.
Текст на сервер передают через поток вывода сокета.
Объект bufferedWriter принимает строку,
newLine завершает запись переводом
строки, flush отправляет буфер в сеть
сразу, не дожидаясь закрытия:
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 ->
input.readLine()
}
}
}.start()
Socket("localhost", port).use { client ->
client.getOutputStream().bufferedWriter()
.use { output ->
output.write("client line")
output.newLine()
output.flush()
}
}
}
}
Сервер в фоне лишь принимает соединение и читает
строку - это заготовка для проверки клиента. Адрес
localhost и порт из localPort
совпадают с теми, что выбрал ServerSocket
в том же запуске:
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 ->
val text = input.readLine()
println("server got: $text")
}
}
}.start()
Socket("localhost", port).use { client ->
client.getOutputStream().bufferedWriter()
.use { output ->
output.write("note from client")
output.newLine()
output.flush()
}
}
}
}
В одном запуске клиент отправляет строку
"ping", сервер печатает её с префиксом
"got: " в консоли.
Строка "alpha" уходит с клиента на
localhost; на стороне сервера в консоли
должно появиться "alpha" без изменений.