Обмен строками по TCP в Java
Полный цикл в одном процессе: фоновый поток ждет
accept(), основной поток открывает
Socket на localhost и номер из
getLocalPort(). Сначала клиент пишет строку,
затем читает ответ, порядок важен, иначе стороны
ждут друг друга.
Ответ сервера попадает в консоль через
System.out.println на клиенте после
readLine() на потоке ввода сокета:
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())
);
input.readLine();
output.write("status: done");
output.newLine();
output.flush();
} catch (Exception e) {
throw new RuntimeException(e);
}
});
worker.start();
try (Socket client = new Socket("localhost", port)) {
BufferedWriter output = new BufferedWriter(
new OutputStreamWriter(client.getOutputStream())
);
BufferedReader input = new BufferedReader(
new InputStreamReader(client.getInputStream())
);
output.write("go");
output.newLine();
output.flush();
System.out.println(input.readLine());
}
}
}
}
Сервер может добавить к ответу прочитанный текст. Клиент печатает готовую строку целиком, так видно, что обмен завершился в рамках одного запуска:
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("heard: " + line);
output.newLine();
output.flush();
} catch (Exception e) {
throw new RuntimeException(e);
}
});
worker.start();
try (Socket client = new Socket("localhost", port)) {
BufferedWriter output = new BufferedWriter(
new OutputStreamWriter(client.getOutputStream())
);
BufferedReader input = new BufferedReader(
new InputStreamReader(client.getInputStream())
);
output.write("wave");
output.newLine();
output.flush();
System.out.println(input.readLine());
}
}
}
}
Клиент отправляет "start" и печатает
ответ "begin: start", который формирует
сервер.
В консоли клиента после обмена должна быть строка
"ok", если сервер получил "check".