【问题标题】:Sending a complex object from Java client to C server via Socket通过 Socket 将复杂对象从 Java 客户端发送到 C 服务器
【发布时间】:2012-04-30 10:16:16
【问题描述】:

我想通过 TCP Socket 将一些复杂的对象从 Java 客户端发送到 C 服务器。

我该怎么做?

【问题讨论】:

  • 您希望 c 服务器如何处理 java 对象的内部表示?
  • 你在写客户端吗?服务器?两者都有?
  • @PabloMaurin 我都在写。

标签: java c sockets tcp


【解决方案1】:

基本上问题是,“如何在一个 语言不可知论的方式?”在你的情况下特别是 Java 和 C。因为你会 通过网络发送这些数据,处理network order/endianness 问题也很重要。

我假设您可以访问客户端和服务器。这意味着你 可以选择如何序列化数据。 (如果没有,答案很简单。写 根据对方的期望)

就个人而言,我会使用Protocol Buffers。 有Java bindingsC bindings

如果您不喜欢 Protocol Buffers,还有其他选项,例如:

【讨论】:

  • 是的,我可以访问两者。在这些之间,哪个是更好的解决方案(最快)?
  • 除非您将原始内存转储到网络,否则无需担心字节顺序。请参阅 commandcenter.blogspot.com/2012/04/byte-order-fallacy.html 上 Rob Pike 的精彩讨论(如果这个名字不熟悉,Pike 是 Unix 的发明者之一。)
【解决方案2】:

将 Java 对象的字段写入字符串(可能是JSON),通过 TCP 发送,让 C 程序读取字符串并使用它在另一端初始化新的 C 变量。

【讨论】:

  • 我已经考虑过这个解决方案。但是我被困在将字符串从 java 发送到 C 中。我成功发送的唯一内容是一个 Char。我虽然大约: 1-发送一个表示字符串长度的整数。 2-做一个动态分配 2-逐个字符发送字符串 我确信这个解决方案会很慢而且性能不佳的问题。那你怎么看?
  • 为了提高性能,您希望在一个数据包中发送尽可能多的数据,但如何表示该数据完全取决于您。例如,您可以将数字 160 作为一个二进制 A0 字节发送,或者您可以将其作为 3 个字符 160 发送,或者您可以发明一些其他表示。唯一重要的是发送者和接收者就表示达成一致。你可以保证这一点,因为你可以控制两端。 @Pablo Maurin 使用协议缓冲区的建议非常合理。
【解决方案3】:

这个问题已经很老了,但万一有人还在寻找一个好的解决方案,你可以尝试协议缓冲区的实现,正如@Adam Liss 之前的回答中提到的那样:(developers.google.com/协议缓冲区/)

简而言之,您可以在协议实现中定义任何复杂的消息类型,并且该工具会生成可以对其进行序列化和反序列化的 C++/Java/Python 代码。

出于使用 C 代码的相同目的,德国慕尼黑工业大学 (TUM) 的一个研究项目创建了一个标准 C 代码生成器,可用于嵌入式 C 项目。这与 Google 的 protobuf 实现完全兼容(由于 C 结构的限制)。这比C Bindings 效果更好,因为它不需要链接任何库。 我在让C Bindings 在我正在使用的嵌入式系统上工作时遇到了问题,因为它需要与支持库链接。

这为我的嵌入式项目节省了(痛苦的)一天 - 在嵌入式系统和 Android 应用程序 (Java)/桌面应用程序 (C++/Qt) 之间传递复杂的网络数据(请求-响应)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2012-12-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    相关资源
    最近更新 更多