4

我有一个通用的套接字编程问题要问你。

我有一个名为 Data 的 C 结构:

struct data {
      double speed;
      double length; 
      char carName[32];
      struct Attribs;
}

struct Attribs {
      int color;
}

我希望能够在 Java 中创建类似的结构,创建套接字,使用上述结构创建数据包,并将其发送到 C++ 套接字侦听器。

关于序列化数据(基本上是数据包中传输的 1 和 0),您能告诉我什么。C++ 如何“读取”这些数据包并重新创建结构?像这样的结构如何存储在数据包中?

一般来说,您可以告诉我任何关于如何解决此类问题的想法。

谢谢!

4

2 回答 2

2
  • 如果您使用二进制序列化,请注意字节顺序。Sun 的 JVM 是 Big Endian,如果您使用的是 Intel x86,那么您使用的是 little endian 机器。
  • 我会使用 Java 的ByteBuffer进行快速的本机序列化。ByteBuffers 是 NIO 库的一部分,因此据说性能比 ol' DataInput/OutputStreams 更高。
  • 特别厌倦序列化浮点数!如上所述,将所有数据通过网络传输到字符串会更安全。
  • 在 C++ 方面,无论网络如何,您都会在某个时候拥有一个填充的数据缓冲区。因此,您的反序列化代码将类似于:

size_t amount_read = 0;
data my_data;
memcpy(buffer+amount_read, &my_data.speed, sizeof(my_data.speed))
amount_read += sizeof(my_data.speed)
memcpy(buffer+amount_read, &my_data.length, sizeof(my_data.length))
amount_read += sizeof(my_data.length)
  • 请注意,基本 C++ 类型的大小是实现定义的,因此 Java 和 C++ 中的原始类型不会直接转换。
  • 您可以使用Google 协议缓冲区。如果处理各种数据结构,我首选的解决方案。
  • 您也可以使用 JSON 进行序列化。
于 2010-08-05T22:21:53.780 回答
0

基本流程是:

  • java 应用程序在 java 应用程序中创建一些可移植版本的结构,例如 XML
  • java 应用程序通过套接字将 XML 发送到 C++ 应用程序
  • C++ 应用程序从 java 应用程序接收 XML
  • C++ 应用程序使用 XML 消息中的数据创建结构实例
于 2010-08-05T21:34:06.120 回答