Я связываюсь с сервером, каждое сообщение, отправленное на сервер, должно быть дополнено длиной сообщения,
unsigned int len = htonl(msg.size());
В прокручивании C длины htonl
и дополнение работ сообщения, в Java, порядок байтов AFAIK уже находится в сетевом порядке, таким образом, я принял все, которое я должен сделать действительно ли запись, является длиной строки перед сообщением к потоку, но это не работает, я пропускаю что-то?
stream.write(msg.length());
stream.write(msg.getBytes());
Поток OutputStream
.
Проблема с вашей реализацией заключается в том, что метод записи записывает только один байт, см. Документацию . Важное предложение здесь: «24 старших бита b игнорируются». Итак, stream.write (msg.length ());
, вероятно, не выполняет то, что задумано. (Я предполагаю, что msg.length () возвращает int, поправьте меня, если я ошибаюсь.)
Попытайтесь записать четыре байта int:
stream.write(msg.length() % 256);
stream.write((msg.length() / 256) % 256);
stream.write((msg.length() / (256 * 256)) % 256);
stream.write((msg.length() / (256 * 256 * 256)) % 256);
Если первым будет записан младший байт, вы можете изменить закажите, если хотите. Вы можете преобразовывать в байты также с битовым сдвигом, деление мне кажется более понятным, но это вопрос личного вкуса.
И int
не имеет определенного порядка байтов во время выполнения на платформе Java просто потому, что нет возможности напрямую наблюдать битовый шаблон, представляющий какое-либо значение. Однако методы , которые каким-то образом преобразуют int
(или другие) значения в байт []
, имеют определенное преобразование.
Таким образом, правильная передача / прием этого значения зависит от правильного кодирования / декодирования в / из байта []
. Пока вы не говорите нам, как вы это делаете, мы не сможем помочь вам сделать это правильно.