Клиент TCP-сокета в Java
Клиентская сторона открывает соединение классом
Socket: первый аргумент конструктора -
имя хоста, второй - номер порта, на котором уже
слушает сервер. Объект Socket реализует
AutoCloseable, поэтому его удобно держать
в try-with-resources.
Текст на сервер передают вывода сокета.
BufferedWriter принимает строку,
newLine() завершает запись переводом
строки, flush() отправляет буфер в сеть
сразу, не дожидаясь закрытия:
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())
);
input.readLine();
} catch (Exception e) {
throw new RuntimeException(e);
}
});
worker.start();
try (Socket client = new Socket("localhost", port)) {
BufferedWriter output = new BufferedWriter(
new OutputStreamWriter(client.getOutputStream())
);
output.write("client line");
output.newLine();
output.flush();
}
}
}
}
Сервер в фоне лишь принимает соединение и читает
строку, это заготовка для проверки клиента. Адрес
localhost и порт из getLocalPort()
совпадают с теми, что выбрал ServerSocket
в том же запуске:
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())
);
String text = input.readLine();
System.out.println("server got: " + text);
} catch (Exception e) {
throw new RuntimeException(e);
}
});
worker.start();
try (Socket client = new Socket("localhost", port)) {
BufferedWriter output = new BufferedWriter(
new OutputStreamWriter(client.getOutputStream())
);
output.write("note from client");
output.newLine();
output.flush();
}
}
}
}
В одном запуске клиент отправляет строку
"ping", сервер печатает её с префиксом
"got: " в консоли.
Строка "alpha" уходит с клиента на
localhost; на стороне сервера в консоли
должно появиться "alpha" без изменений.