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

Сервер TCP-сокета в Java

Сервер создают через ServerSocket с номером порта. Вызов accept() блокирует поток, пока клиент не подключится; он возвращает отдельный Socket для обмена с этим клиентом. Его тоже держат в try-with-resources.

Входящую строку читают readLine() из BufferedReader на потоке ввода сокета. Ответ записывают в BufferedWriter на потоке вывода и сразу сбрасывают буфер:

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; public class Main { public static void main(String[] args) throws Exception { try (ServerSocket server = new ServerSocket(0)) { int port = server.getLocalPort(); Thread worker = new Thread(() -> { try (Socket peer = server.accept()) { BufferedReader input = new BufferedReader( new InputStreamReader(peer.getInputStream()) ); BufferedWriter output = new BufferedWriter( new OutputStreamWriter(peer.getOutputStream()) ); String line = input.readLine(); output.write("echo: " + line); output.newLine(); output.flush(); } catch (Exception e) { throw new RuntimeException(e); } }); worker.start(); try (Socket client = new Socket("localhost", port)) { BufferedWriter out = new BufferedWriter( new OutputStreamWriter(client.getOutputStream()) ); BufferedReader in = new BufferedReader( new InputStreamReader(client.getInputStream()) ); out.write("probe"); out.newLine(); out.flush(); in.readLine(); } } } }

Прослушивание порта удобно вынести в фоновый поток, чтобы в main осталось место для клиента. Схема та же: new ServerSocket(0), затем accept(), чтение одной строки и ответ:

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; public class Main { public static void main(String[] args) throws Exception { try (ServerSocket server = new ServerSocket(0)) { int port = server.getLocalPort(); Thread worker = new Thread(() -> { try (Socket peer = server.accept()) { BufferedReader input = new BufferedReader( new InputStreamReader(peer.getInputStream()) ); BufferedWriter output = new BufferedWriter( new OutputStreamWriter(peer.getOutputStream()) ); String line = input.readLine(); output.write("ok: " + line); output.newLine(); output.flush(); } catch (Exception e) { throw new RuntimeException(e); } }); worker.start(); try (Socket client = new Socket("localhost", port)) { BufferedWriter out = new BufferedWriter( new OutputStreamWriter(client.getOutputStream()) ); BufferedReader inp = new BufferedReader( new InputStreamReader(client.getInputStream()) ); out.write("ready"); out.newLine(); out.flush(); System.out.println(inp.readLine()); } } } }

После строки "ask" от клиента сервер отвечает "answer: ask"; клиент выводит эту строку в консоль.

Сервер возвращает клиенту текст "pong", если получил "ping"; в консоли клиента должно быть "pong".

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