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

21 Авг 2019 в 07:06
192 +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 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир