Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗ktSpSoSrv 280 of 299 menu
◀ ▶

Сервер сокета в 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".

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить