Введение в TCP-сокеты в Java
Два процесса на разных машинах или на одной могут
обмениваться данными по TCP: канал держится открытым,
пока стороны не закроют сокеты. Для учебных примеров
достаточно JDK без сторонних библиотек, классы лежат
в java.net.
На стороне сервера ServerSocket слушает номер
порта на машине; клиент обращается к паре
"хост:порт", чаще всего к
localhost при локальной проверке. После
установки связи обе стороны читают и пишут один
непрерывный поток байтов, текст удобно передавать
построчно через BufferedReader и
BufferedWriter.
В учебном примере сервер и клиент живут в одном
main: прослушивание порта уходит в отдельный
Thread, а клиент подключается к тому же
процессу. Порт 0 при создании
ServerSocket означает «любой свободный»;
фактический номер берут из getLocalPort().
Сокеты закрывают через try-with-resources, чтобы
освободить ресурс после обмена:
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("reply: " + 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("hello socket");
out.newLine();
out.flush();
System.out.println(in.readLine());
}
}
}
}
Клиент отправляет одну строку hello socket,
сервер отвечает строкой с префиксом reply:.
В консоли появляется ответ сервера, весь обмен
укладывается в один запуск.