Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗jvSpSoSev 304 of 322 menu
◀ ▶

Несколько сообщений по 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" и выводит их в консоль.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить