【发布时间】:2015-09-25 12:06:33
【问题描述】:
是否有可能使用 RMI 实现在 linux 操作系统中运行的 C++ 程序(客户端程序)与在 Windows 中运行的 C# 程序(服务器程序)之间实现客户端/服务器通信?任何人都可以提出任何建议吗?可能的方式...欢迎任何有用的参考
【问题讨论】:
-
为什么要用Java技术让C++和C#说话?这将是双向的上坡......
标签: c# c++ client-server rmi
是否有可能使用 RMI 实现在 linux 操作系统中运行的 C++ 程序(客户端程序)与在 Windows 中运行的 C# 程序(服务器程序)之间实现客户端/服务器通信?任何人都可以提出任何建议吗?可能的方式...欢迎任何有用的参考
【问题讨论】:
标签: c# c++ client-server rmi
您需要按照 Google Protobuf 的方式进行操作。它也适用于 C++ 和 C#。
来自MSDN的类似回答
不管你是从 java、c++ 还是 c# 发送数据,什么时候发送 在网络上它只是 1 和 0。这是你做什么的问题 在客户端/服务器端使用它。因此,请确保您的数据 接收与您拥有的结构相对应(您想要 反序列化到)。
有时您需要手动将位和字节放在一起以获得 一切顺利。但是,有一种叫做“Protobuff”的东西 这可以帮助您获得所发送数据的通用结构, 谷歌它并阅读所有相关信息。
您可以使用套接字实现客户端服务器并使用 protobuf 对其进行序列化/反序列化。 (MSDN 链接可能有助于解决)
我认为消息传递库最适合这一点。以ZMQ 为例;它们具有多种语言的绑定here 所以你可能有你的事件调度器用一种语言和另一种语言的监听器。也可以看看apache thrift
【讨论】:
CORBA 是一种 IPC 机制,它将提供您正在寻找的 RPC 机制。
这是一个描述 C# 服务器和 JAVA 客户端之间通信的链接。
http://iiop-net.sourceforge.net/dnAdderRmiClient.html
在我之前工作的一家公司,它被用于客户端/服务器模型中的 c++ 和 java 程序之间的通信。
他们使用了 ACE/TAO 库的组合。
【讨论】:
我建议您不要使用远程方法调用在客户端和服务器之间进行通信。在 19 世纪 90 年代,我们曾经认为 RMI 是一个好主意,但从那时起我们意识到计算机之间有更好的通信方式。
最流行的方式是使用 Web 服务,而最简单的 Web 服务风格是 RESTful Web 服务。 (查找它们。)这样做的好处是根本不关心客户端的运行时环境是否看起来像服务器的运行时环境,就像您的设置一样,您的客户端是 Linux 上的 C++ 和您的服务器在 Windows 上是 C#。
【讨论】:
Mozilla 的 XPCOM 可能是您的桥梁。还有 PyXPCOM。实际上,虽然最简单的方法是拥有一个中间 VBox。因此,您在 linux 机器上运行 VBox 实例(运行 Windows),然后使用 VBox API(来自 C++)在 VBox 中发出命令。所以你最终得到了
Linux VBox Windows
【讨论】:
通过网络工作时,重要的是协议,而不是客户端/服务器。
在电信领域,通信协议是一种规则系统,它允许通信系统的两个或多个实体通过物理量的任何种类的变化来传输信息. 这些是定义通信的语法、语义和同步以及可能的错误恢复方法的规则或标准。
Source 重点是我的。
因此,为了使您的 C++ 客户端和 C# 服务器通信,您需要选择或定义将用于通信的协议。
您的协议可以构建在另一个协议之上。例如,您可以将 HTTP 用于传输目的,并定义协议来描述 HTTP 请求和响应正文中的消息应该使用什么语法。这将对您有所帮助,因为有许多现成的 HTTP 通信解决方案。
实际上,无论如何,您都将基于另一个协议来构建您的协议。 HTTP 本身构建在 TCP 之上。您需要选择它是低级协议还是高级协议。它们各有优缺点。
但是您必须自己处理客户端和服务器之间的消息传递。
作为替代方案,您可以使用一些远程过程调用(或 RPC)解决方案:
远程过程调用 (RPC) 是一种进程间通信,它允许计算机程序使子例程或过程在另一个地址空间(通常在共享网络上的另一台计算机上)执行,而无需程序员明确编码这种远程交互。
这意味着您只需遵循如何构建客户端和服务器的指南,所有通信都将被隐藏,看起来就像调用对象的方法一样。
以下是可能的 RPC 解决方案的简短列表:
总结一下:
你的客户端和服务器处于不同的环境,使用不同的平台开发,这不是问题。您只需使用您自己的基于某种协议的消息系统或某种 RPC 系统在它们之间建立通信。
【讨论】:
我们可以只编写一个 C# 程序来监听来自特定端口的消息,然后编写另一个 C++ 客户端程序来向该端口写入消息。因此我们可以与两个应用程序通信。
【讨论】: