Сервер 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".