Как я могу убедиться, что мой сервер читает то, что написал клиент? - PullRequest
0 голосов
/ 09 апреля 2011

Я записываю байтовый массив из клиента сокета в виде:

byte[] arr = { 49, 49, 49, 49, 49};

InetAddress address = InetAddress.getByName(host);
connection = new Socket(address, port);
out = new ObjectOutputStream(connection.getOutputStream());
out.flush();

При получении на сервере я получаю:

byte[] msgType = new byte[5];
in = new BufferedInputStream(connection.getInputStream());
int bytesRead = in.read(msgType, 0, 5);

System.out.println("msg rcvd: " + msgType.toString());

В результате я получаю странную строку:

server: waiting for connection
server: connection received from localhost
server: Connection Successful
bytes read: 5
msg rcvd: ��w

Как сделать так, чтобы я получал те же байты, что и мой клиент?

Ответы [ 3 ]

1 голос
/ 09 апреля 2011

Вы получаете те же байты, это просто вопрос того, как вы их интерпретируете. Если вы хотите видеть байты как String, используйте вместо этого:

System.out.println("msg rcvd: " + new String(msgType, "UTF-8"));

Будьте осторожны, чтобы байты, с которыми вы работаете, имели правильную кодировку (здесь я предположил UTF-8) Поскольку вы уже ObjectOutputStream, вы можете просто использовать его writeUTF() на стороне сервера и ObjectInputStream.readUTF() на стороне клиента.

1 голос
/ 09 апреля 2011

Я не совсем уверен, что именно пытается распечатать, но я могу вам сказать, что msgType.toString() не будет печатать содержимое байтового массива.

Здесь - это ссылка, которую я нашел на метод, который выводит байтовый массив более осмысленным образом.

0 голосов
/ 09 апреля 2011

Если вы используете ObjectOutputStream на одной стороне, вам придется использовать ObjectInputStream на другой стороне.

В вашем случае подойдет простой OutputStream (возможно, буферизованный) и .write() и .read().

Но для печати не используйте byte[].toString(), используйте Arrays.toString(), если вы хотите иметь форматированный вывод.


Редактировать: Я просто вижу, что вы даже не пишете свой массив на отправляющей стороне. Таким образом, вы на самом деле только читаете заголовок ObjectOutputStream.


Из комментария:

Я работаю на стороне сервера, и мне сказали, что я отправлю байтовый массив. Как получить и распечатать этот байтовый массив? байтовый массив в данном случае это байты текста / строк

Звучит так, будто сервер отправляет что-то вроде строк, закодированных в какой-то кодировке, например, ASCII, UTF-8 или ISO-8859-1. Если это так, на принимающей стороне вы можете использовать что-то вроде этого:

String encoding = "UTF-8";
BufferedReader in =
    new BufferedReader(new InputStreamReader(connection.getInputStream(),
                                             encoding));
String line;
while((line = in.readLine()) != null) {
    System.out.println(line);
}

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

Соответствующий код отправки может быть примерно таким:

String encoding = "UTF-8";
Writer w =
    new BufferedWriter(new OutputStreamWriter(connection.getOutputStream(),
                                              encoding));
w.write("Hello World!\n");
w.write("And another line.\n");
w.flush();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...