Несколько сообщений по TCP в Java
Одно TCP-соединение может передать несколько строк
подряд: каждая заканчивается переводом строки, как
при одиночной отправке. Сервер читает в цикле, пока
readLine() возвращает текст.
Когда клиент закончил писать, поток вывода сокета
закрывают, сервер получит null и поймет,
что новых строк не будет. Три строки отправляют в
цикле, затем закрывают writer на клиенте:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;
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())
);
while (true) {
String line = input.readLine();
if (line == null) {
break;
}
output.write("ack: " + 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())
);
List<String> lines = List.of("one", "two", "three");
for (String line : lines) {
output.write(line);
output.newLine();
output.flush();
}
output.close();
for (int i = 0; i < 3; i++) {
System.out.println(input.readLine());
}
}
}
}
}
Клиент читает три ответа ack:... после
закрытия записи. Сервер отвечает на каждую строку
отдельно, пока поток ввода не оборвется:
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())
);
int count = 0;
while (true) {
String line = input.readLine();
if (line == null) {
break;
}
count++;
System.out.println("line " + count + ": " + line);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
});
worker.start();
try (Socket client = new Socket("localhost", port)) {
BufferedWriter output = new BufferedWriter(
new OutputStreamWriter(client.getOutputStream())
);
for (int index = 0; index < 3; index++) {
output.write("part-" + index);
output.newLine();
output.flush();
}
output.close();
}
}
}
}
Даны строки:
var rows = List.of("a", "b", "c");
Отправьте их с клиента; сервер печатает каждую с
префиксом "item: ", затем клиент
закрывает запись.
Даны строки клиента:
var rows = List.of("n1", "n2", "n3");
Клиент после этих строк читает ответы
"got n1", "got n2",
"got n3" и выводит их в консоль.