Java и двоичные данные в контексте сокетов - PullRequest
0 голосов
/ 01 августа 2010

Java новичок здесь. Существуют ли вспомогательные функции для сериализации данных в и из байтовых массивов? Я пишу пакет Java, который реализует сетевой протокол. Поэтому я должен записать в цикл некоторые типичные переменные, такие как версия (1 байт), порядковый номер (длинный) и двоичные данные (байты). Как мне сделать это на Java? Исходя из C, я думаю о создании байтового массива необходимого размера, а затем, так как нет memcpy (), я конвертирую long во временный байтовый массив и затем копирую его в реальный байтовый массив. Это кажется неэффективным, а также склонным к ошибкам. Есть ли класс, который я мог бы использовать для маршалинга и демаршаллинга параметров в байтовом массиве?

Кроме того, почему все классы Socket работают только с char [], а не byte []? Сокет по определению должен иметь дело и с двоичными данными. Как это делается в Java?

Я уверен, что мне не хватает мышления Java. Цените это, если кто-то может указать это мне.

РЕДАКТИРОВАТЬ: я смотрел на DataOutputStream и DataInputStream, но я не могу преобразовать байты в строку, а не в байт [], что означает, что информация может быть потеряна при преобразовании для записи в сокет.

  • Pav

Ответы [ 4 ]

2 голосов
/ 01 августа 2010

Посмотрите на DataInputStream, DataOutputStream, ObjectInputStream и ObjectOutputStream. Сначала проверьте, является ли формат данных приемлемым для вас. Также сериализация.

0 голосов
/ 02 августа 2010

Как и выше, DataInputStream и DataOutputStream - это именно то, что вы ищете. Вспомните свой комментарий о String: если вы планируете использовать Java Strings по сети, вы не разрабатываете сетевой протокол, вы разрабатываете протокол Java. Существуют readUTF () и writeUTF (), если вы уверены, что другой конец - Java, или если вы можете кодировать другой конец для понимания этих форматов. Либо вы можете отправлять в виде байтов вместе с соответствующей кодировкой или предварительно определять кодировку для всего протокола, если это имеет смысл.

0 голосов
/ 01 августа 2010

Если вы отправляете данные через сокет, тогда вам вообще не нужен временный байтовый массив;Вы можете обернуть OutputStream сокета с помощью DataOutputStream или ObjectOutputStream и просто написать то, что хотите записать.

Возможно, я пропустил аспект, который означает, что вам действительно нужны временные байтовые массивы.Если это так, посмотрите на ByteArrayOutputStream.Кроме того, нет memcpy (), конечно, но есть System.arraycopy.

0 голосов
/ 01 августа 2010

Сокеты не имеют отношения ни к char[], ни к byte[], но к InputStream и OutputStream, которые используются для чтения и записи байтов.

...