2010-10-21 31 views
6

Tôi là lập trình viên C++ và có nhu cầu thiết lập một số liên lạc UDP giữa ứng dụng android java và máy chủ C++ chạy trên PC.Gửi cấu trúc C++ qua UDP trong Java

Tôi có cấu trúc mà tôi cần phải nhận được trên PC mà bao gồm các nội dung sau:

int 
int 
float 

Đáng tiếc là tôi hoàn toàn tại một mất mát như thế nào tôi có thể làm điều này với Java.

Tôi cần tạo DatagramPacket nhưng hàm tạo chỉ mất một mảng byte. Bây giờ với C++ này sẽ là một diễn viên dễ dàng từ một cấu trúc để một char *. Tuy nhiên đúc như thế này là không thể với Java.

Tôi đã tạo một lớp đơn giản có các trường ở trên trong đó. Điều đó có vẻ ổn. Vấn đề còn lại của tôi là làm thế nào để biến nó thành một mảng byte. Bất cứ ai có thể giúp một Java noob trên mặt trận này?

Chúc mừng!

Edit: Tôi đã tạo một hàm trong lớp nào sau đây

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

Có cách nào tốt hơn để làm điều này?

Tôi không muốn sử dụng bộ đệm giao thức google được đề cập trong câu trả lời của Steve bởi vì, trong khi thú vị của nó, nó sẽ đòi hỏi quá nhiều thay đổi để triển khai nền tảng khác mà tôi thực sự không muốn làm.

+0

Tôi thông cảm với ý tưởng rằng 'protobuf' là búa tạ để bẻ khóa hạt trong trường hợp này. Tuy nhiên, các yêu cầu này có một cách mở rộng mặc dù - bạn có thể thấy 'protobuf' là chính đáng, nếu tập dữ liệu bạn phải xử lý dự kiến ​​sẽ tăng lên. –

Trả lời

7

Bạn có thể sử dụng Google protocol buffers làm cách độc lập với ngôn ngữ để sắp xếp các cấu trúc để truyền và nhận. Cả Java và C++ đều có sẵn trong hộp, và Jon Skeet đã viết một bản triển khai C# sản xuất sẵn sàng.

Tôi thấy một vài ví dụ về Protobuf đang được sử dụng trên Android, bao gồm this.

2

khác, cách tiếp cận có thể đơn giản xuất phát từ 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. 
    } 
} 

mảnh Khá xấu xí của mã, nhưng vẫn đẹp hơn giao dịch trực tiếp với bộ đệm JNI hoặc đã nói đệm giao thức của Google.