【发布时间】:2012-04-30 10:16:16
【问题描述】:
我想通过 TCP Socket 将一些复杂的对象从 Java 客户端发送到 C 服务器。
我该怎么做?
【问题讨论】:
-
您希望 c 服务器如何处理 java 对象的内部表示?
-
你在写客户端吗?服务器?两者都有?
-
@PabloMaurin 我都在写。
我想通过 TCP Socket 将一些复杂的对象从 Java 客户端发送到 C 服务器。
我该怎么做?
【问题讨论】:
基本上问题是,“如何在一个 语言不可知论的方式?”在你的情况下特别是 Java 和 C。因为你会 通过网络发送这些数据,处理network order/endianness 问题也很重要。
我假设您可以访问客户端和服务器。这意味着你 可以选择如何序列化数据。 (如果没有,答案很简单。写 根据对方的期望)
就个人而言,我会使用Protocol Buffers。 有Java bindings 和C bindings。
如果您不喜欢 Protocol Buffers,还有其他选项,例如:
【讨论】:
将 Java 对象的字段写入字符串(可能是JSON),通过 TCP 发送,让 C 程序读取字符串并使用它在另一端初始化新的 C 变量。
【讨论】:
A0 字节发送,或者您可以将其作为 3 个字符 1、6、0 发送,或者您可以发明一些其他表示。唯一重要的是发送者和接收者就表示达成一致。你可以保证这一点,因为你可以控制两端。 @Pablo Maurin 使用协议缓冲区的建议非常合理。
这个问题已经很老了,但万一有人还在寻找一个好的解决方案,你可以尝试协议缓冲区的实现,正如@Adam Liss 之前的回答中提到的那样:(developers.google.com/协议缓冲区/)
简而言之,您可以在协议实现中定义任何复杂的消息类型,并且该工具会生成可以对其进行序列化和反序列化的 C++/Java/Python 代码。
出于使用 C 代码的相同目的,德国慕尼黑工业大学 (TUM) 的一个研究项目创建了一个标准 C 代码生成器,可用于嵌入式 C 项目。这与 Google 的 protobuf 实现完全兼容(由于 C 结构的限制)。这比C Bindings 效果更好,因为它不需要链接任何库。 我在让C Bindings 在我正在使用的嵌入式系统上工作时遇到了问题,因为它需要与支持库链接。
这为我的嵌入式项目节省了(痛苦的)一天 - 在嵌入式系统和 Android 应用程序 (Java)/桌面应用程序 (C++/Qt) 之间传递复杂的网络数据(请求-响应)。
【讨论】: