代码之家  ›  专栏  ›  技术社区  ›  Goz

在Java中通过UDP发送C++结构

  •  6
  • Goz  · 技术社区  · 14 年前

    我是一个C++程序员,需要在Java Android应用程序和PC机上运行的C++服务器之间建立一些UDP通信。

    我需要在PC上接收的结构包括以下内容:

    int
    int
    float
    

    不幸的是,我完全不知道如何用Java来实现这一点。

    我需要创建一个数据包,但构造函数只接受一个字节数组。现在用C++,这将是一个从结构到字符的简单的转换。然而,这样的铸造是不可能的Java。

    我创建了一个简单类,其中包含上述字段。那似乎很好。我剩下的问题是如何将其转换为字节数组。有人能帮助这个前台的Java NoB吗?

    干杯!

    编辑:我在类中创建了一个函数,它执行以下操作

            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协议缓冲区,因为尽管它很有趣,但是它需要对其他平台实现进行太多的更改,而我真的不愿意这样做。

    2 回复  |  直到 7 年前
        1
  •  7
  •   Steve Townsend    14 年前

    你可以使用 Google protocol buffers 作为一种独立于语言的方法来序列化传输和接收的结构。Java和C++都是现成的,Jon Skeet编写了一个产品准备的C语言实现。

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

        2
  •  2
  •   iirekm    14 年前

    另一种可能更简单的方法来自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协议缓冲区更漂亮。