Отправка структуры C ++ через UDP в Java - PullRequest
6 голосов
/ 21 октября 2010

Я программист на C ++ и мне нужно настроить UDP-связь между Java-приложением для Android и сервером C ++, работающим на ПК.

У меня есть структура, которую мне нужно получить на ПК, которая состоит из следующего:

int
int
float

К сожалению, я в полном недоумении, как я могу сделать это с Java.

Мне нужно создать DatagramPacket, но конструктор принимает только байтовый массив. Теперь с C ++ это было бы легко привести от структуры к символу *. Однако такое приведение не возможно с Java.

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

Ура!

Edit: я создал функцию в классе, которая делает следующее

        public byte[] GetBytes() throws IOException
        {
            ByteArrayOutputStream   byteOut = new ByteArrayOutputStream();
            DataOutputStream        dataOut = new DataOutputStream( byteOut ); 
            dataOut.writeInt( Integer.reverseBytes( int1) );
            dataOut.writeInt( Integer.reverseBytes( int2 ) );
            dataOut.writeFloat( float1 );

            return byteOut.toByteArray();
        }

Есть ли лучший способ сделать это?

Я бы предпочел не использовать буфер протокола Google, упомянутый в ответе Стива, потому что, хотя он и интересен, он потребовал бы слишком большого количества изменений в других реализациях платформы, чего я бы действительно не хотел.

Ответы [ 2 ]

7 голосов
/ 21 октября 2010

Вы можете использовать буферы протокола Google как независимый от языка способ сериализации структур для передачи и получения. Как Java, так и C ++ доступны "из коробки", и Джон Скит написал готовую к реализации реализацию на C #.

Я вижу несколько примеров использования Protobuf на Android, включая this .

2 голосов
/ 21 октября 2010

Другой, возможно, более простой подход исходит от Javolution.struct: http://javolution.org/target/site/apidocs/javolution/io/Struct.html

 public static class Student extends Struct {
     public final Enum32<Gender>       gender = new Enum32<Gender>(Gender.values());
     public final UTF8String           name   = new UTF8String(64);
     public final Date                 birth  = inner(new Date());
     public final Float32[]            grades = array(new Float32[10]);
     public final Reference32<Student> next   =  new Reference32<Student>();
 }
class UDPMessage extends Struct {
      Student student = inner(new Student());
      ...
 }
 ...
 public void run() {
     byte[] bytes = new byte[1024];
     DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
     UDPMessage message = new UDPMessage();
     message.setByteBuffer(ByteBuffer.wrap(bytes), 0);
     // packet and message are now two different views of the same data.
     while (isListening) {
         multicastSocket.receive(packet);
         int xxx = message.xxx.get();
         ... // Process message fields directly.
     }
 }

Довольно некрасивый кусок кода, но все же красивее, чем иметь дело с буферами JNI или уже упомянутыми буферами протокола Google.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...