Отправка структуры C++ через UDP в Java
Я программист на C++ и мне нужно настроить некоторые UDP-связи между приложением java android и сервером C++, работающим на ПК.
у меня есть структура, которую мне нужно получить на ПК, которая состоит из следующего:
int
int
float
к сожалению, я совершенно не понимаю, как я могу это сделать с Java.
мне нужно создать DatagramPacket, но конструктор принимает только массив байтов. Теперь с C++ это будет простой переход от структуры к пеструшка.* Однако кастинг, подобный этому, невозможен с Java.
Я создал простой класс, в котором есть вышеуказанные поля. Кажется, все в порядке. Моя оставшаяся проблема заключается в том, как превратить это в массив байтов. Может ли кто-нибудь помочь Java noob на этом фронте?
Ура!
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 ответов
можно использовать буферы протокола Google как независимый от языка способ сериализации структур для передачи и приема. Как Java, так и C++ доступны из коробки, и Джон Скит написал готовую к производству реализацию C#.
Я вижу несколько примеров использования Protobuf на Android, в том числе этой.
другой, возможно, более простой подход исходит из 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.