2010-10-21 32 views
6

我是C++程序员,需要在java android应用程序和运行在PC上的C++服务器之间建立一些UDP通信。在Java中通过UDP发送C++结构

我有结构的,我需要收到由以下的PC上:

int 
int 
float 

不幸的是我完全不知所措,我怎么能做到这一点与Java。

我需要创建一个DatagramPacket,但构造函数只需要一个字节数组。现在用C++,这将是一个从结构到char *的简单转换。然而,像Java这样的转换对Java来说是不可能的。

我已经创建了一个简单的类,它有上面的字段。这似乎很好。我剩下的问题是如何将它变成一个字节数组。任何人都可以在这方面帮助Java noob吗?

干杯!

编辑:我创建了一个,做以下

 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(); 
     } 

有没有更好的方式来做到这一点的类中的函数?

我宁可不使用Steve答案中提到的google协议缓冲区,因为虽然它很有趣,但它需要对其他平台实现进行太多更改,而我真的不想这么做。

+0

我同情'protobuf'这个概念,在这种情况下,它是一个大锤来打破坚果。然而,这些要求有扩展的方法 - 如果您需要处理的数据集预计会增长,您可能会发现protobuf是合理的。 – 2010-10-21 13:48:42

回答

7

您可以使用Google protocol buffers作为语言无关的方式来序列化传输和接收结构。 Java和C++都是开箱即用的,Jon Skeet编写了一个可以生产的C#实现。

我看到了一些Protobuf在Android上使用的例子,包括this

2

另一个,也许更简单的方法来自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缓冲区或已经提到的谷歌协议缓冲区处理漂亮。