Какие потоки вводы/вывода использовать в клиент-серверном приложении (TCP)? Добрый день.
Создаю клиентское и серверное приложение на Java (TCP протокол).
Однако не могу подобрать какие декораторы потоков ввода/вывода использовать в данном случае.
Сейчас использую ObjectInputStream и ObjectoutputStream соответсвенно, но они не очень удобны.
Подскажите какие лучше использовать, учитывая специфику задачи:Клиент посылает короткие сообщения на сервер (один объект типа String) в качестве ответа получает короткое или длинное сообщение (один объект типа String или их массив).
Сервер, соответсвенно, наоборот.
В С++ я бы передавал в начале любого сообщения его длину, чтобы получатель знал, сколько раз считывать входной поток. Думаю, на Java есть более высокоуровневое решение.

21 Авг 2019 в 07:06
170 +1
1
Ответы
1

В вашем случае можно использовать BufferedReader и BufferedWriter для чтения и записи строковых данных. Когда клиент отправляет сообщения на сервер, он может использовать BufferedWriter для отправки сообщения (символьные данные), а сервер может использовать BufferedReader для чтения этого сообщения.

Для передачи длины сообщения перед самим сообщением вы можете использовать DataOutputStream на стороне отправителя и DataInputStream на стороне получателя. Эти классы позволяют записывать и читать примитивные типы данных, включая int, который может использоваться для передачи длины сообщения.

Примерно так будет выглядеть код на стороне клиента:

Socket socket = new Socket("localhost", 8080);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String message = "Hello, Server!";
writer.write(message);
writer.newLine();
writer.flush();
DataInputStream dis = new DataInputStream(socket.getInputStream());
int length = dis.readInt();
byte[] messageBytes = new byte[length];
dis.readFully(messageBytes);
String receivedMessage = new String(messageBytes);
System.out.println(receivedMessage);

И на стороне сервера:

ServerSocket serverSocket = new ServerSocket(8080);
Socket socket = serverSocket.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message = reader.readLine();
System.out.println("Received message: " + message);
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
byte[] messageBytes = message.getBytes();
dos.writeInt(messageBytes.length);
dos.write(messageBytes);
dos.flush();

Надеюсь, это поможет вам с выбором потоков ввода/вывода для вашего клиент-серверного приложения на Java.

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 493 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир