На сервере я отправил байтовый массив клиенту через Java-сокет
byte[] message = ... ;
DataOutputStream dout = new DataOutputStream(client.getOutputStream());
dout.write(message);
Как я могу получить этот массив байтов от клиента?
На сервере я отправил байтовый массив клиенту через Java-сокет
byte[] message = ... ;
DataOutputStream dout = new DataOutputStream(client.getOutputStream());
dout.write(message);
Как я могу получить этот массив байтов от клиента?
Попробуй, это работает для меня.
Отправитель:
byte[] message = ...
Socket socket = ...
DataOutputStream dOut = new DataOutputStream(socket.getOutputStream());
dOut.writeInt(message.length); // write length of the message
dOut.write(message); // write the message
Получатель:
Socket socket = ...
DataInputStream dIn = new DataInputStream(socket.getInputStream());
int length = dIn.readInt(); // read length of incoming message
if(length>0) {
byte[] message = new byte[length];
dIn.readFully(message, 0, message.length); // read the message
}
Во-первых, не используйте DataOutputStream
, если это действительно необходимо. Во-вторых:
Socket socket = new Socket("host", port);
OutputStream socketOutputStream = socket.getOutputStream();
socketOutputStream.write(message);
Конечно, этого не хватает для проверки ошибок, но это должно заставить вас идти. JDK API Javadoc является вашим другом и может вам очень помочь.
Здесь есть учебник сокетов JDK здесь, который охватывает как сервер, так и клиентский конец. Это похоже на то, что вы хотите.
(из этого учебника) Это настраивается для чтения с эхо-сервера:
echoSocket = new Socket("taranis", 7);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(
echoSocket.getInputStream()));
берет поток байтов и преобразует в строки через считыватель и использует кодировку по умолчанию (обычно не рекомендуется).
Обработка ошибок и закрытие сокетов/потоков исключены из вышеперечисленного, но проверьте учебник.
Вам нужно либо указать фиксированный размер сообщения, либо вам нужно отправить размер, либо вам нужно использовать некоторые разделительные символы.
Это самый простой случай для известного размера (100 байт):
in = new DataInputStream(server.getInputStream());
byte[] message = new byte[100]; // the well known size
in.readFully(message);
В этом случае DataInputStream
имеет смысл, поскольку он предлагает readFully()
. Если вы его не используете, вам нужно зациклиться до ожидаемого количества байтов.