@awil00

Как проверить, поступили ли данные с сервера, и передать byte array?

Недавно начал изучать сетевое программирование и Java. Есть сервер, который отправляет клиенту пакет с данными, представленный в виде byte[ ], для отправки использовал PrintWriter. Принимал на клиенте с помощью Scanner, и почему-то, к примеру, вместо массива byte, где 53 элемента, получался массив из 10 элементов. Scanner жизненно необходим из-за удобного hasNext(), в других аналогах я не нашёл похожего, но Scanner не очень работает с byte[ ], поэтому задумка была такая: пакет превращаем в byte[ ], а потом в String, посылаем его, на клиенте String превращаем в byte[ ], а потом получаем исходный пакет с помощью parse. Но так не работает. BufferedInputStream / BufferedOutputStream работают правильно, но в таком случае нет hasNext() для бесперебойной работы программы.
Что я делаю не так?
Клиент
while (true) {
                        if (input.hasNext()) {
                            byte[] message = input.nextLine().getBytes(StandardCharsets.UTF_8);
                            MSPacket pct = MSPacket.parse(message);
                            System.out.println(new String(pct.senderName, StandardCharsets.UTF_8) +
                                    new String(pct.msg, StandardCharsets.UTF_8));

Сервер
MSPacket msgToClient = new MSPacket("Сервер", "Hello!!!", 0x01);
output.println(msgToClient.toPacket().toString());
output.flush();
  • Вопрос задан
  • 283 просмотра
Пригласить эксперта
Ответы на вопрос 2
@awil00 Автор вопроса
Наконец-то исправил. Проблема была в кодировке. При передаче byte array надо конвертировать в String с использованием кодировки "windows-1251" с помощью new String(msgToClient.ToPacket(), "windows-1251"), на клиенте принять с помощью input.nextLine().getBytes("windows-1251").
Ответ написан
Комментировать
@Paveldik
На java я не пишу, но знаю, что в случаях, когда набор битов / байтов необходимо для хранения либо передачи преобразовать в "человекочитаемую" строку, используется кодировка base-64 (используется, например, в почтовых сообщениях, при хранении байтов в 1С)
Попробуйте перед помещением своих байтов в println конвертнуть ее в эту кодировку.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы