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