2010-10-21 61 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緩衝區或已經提到的谷歌協議緩衝區處理漂亮。