Socket посылать и принимать байтовые массивы

На сервере я отправил байтовый массив клиенту через Java-сокет

byte[] message = ... ;

DataOutputStream dout = new DataOutputStream(client.getOutputStream());
dout.write(message);

Как я могу получить этот массив байтов от клиента?

Ответы

Ответ 1

Попробуй, это работает для меня.

Отправитель:

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
}

Ответ 2

Во-первых, не используйте DataOutputStream, если это действительно необходимо. Во-вторых:

Socket socket = new Socket("host", port);
OutputStream socketOutputStream = socket.getOutputStream();
socketOutputStream.write(message);

Конечно, этого не хватает для проверки ошибок, но это должно заставить вас идти. JDK API Javadoc является вашим другом и может вам очень помочь.

Ответ 3

Здесь есть учебник сокетов JDK здесь, который охватывает как сервер, так и клиентский конец. Это похоже на то, что вы хотите.

(из этого учебника) Это настраивается для чтения с эхо-сервера:

    echoSocket = new Socket("taranis", 7);
    out = new PrintWriter(echoSocket.getOutputStream(), true);
    in = new BufferedReader(new InputStreamReader(
                                echoSocket.getInputStream()));

берет поток байтов и преобразует в строки через считыватель и использует кодировку по умолчанию (обычно не рекомендуется).

Обработка ошибок и закрытие сокетов/потоков исключены из вышеперечисленного, но проверьте учебник.

Ответ 4

Вам нужно либо указать фиксированный размер сообщения, либо вам нужно отправить размер, либо вам нужно использовать некоторые разделительные символы.

Это самый простой случай для известного размера (100 байт):

in = new DataInputStream(server.getInputStream());
byte[] message = new byte[100]; // the well known size
in.readFully(message);

В этом случае DataInputStream имеет смысл, поскольку он предлагает readFully(). Если вы его не используете, вам нужно зациклиться до ожидаемого количества байтов.