设计一个跨平台的通信接口

本文关键字:一个 跨平台 通信接口 | 更新日期: 2023-09-27 18:17:07

我有一个在本地系统上运行的c#程序,它需要能够做两件事。

  1. 在运行Windows、Linux或Android的远程系统上异步剥离远程作业。
  2. 为这些系统提供一种将这些作业的输出(StdOut/StdErr)发回本地系统的方法。

以前,我在与远程windows系统通信时使用WCF。我在远程windows系统上创建了一个WCF服务器,然后我的本地机器可以通过该WCF通道发送命令和消息。当我尝试在Linux和Android上做同样的事情时,事情变得更复杂了。

我想我可以使用REST设置一个本地WCF服务,这样所有3个平台都可以通过JSON REST使用任何方便的语言(最有可能是c++)向它发送消息。那么,实现需求1的最佳方式是什么呢?

我应该在c++中创建一个运行在Linux和Android上的REST服务器吗?WCF甚至可以使用不是用。net编写的c++ REST服务器吗?我是不是最好做一些简单的TCP套接字?

安全性不是问题,因为这是在安全的专用网络上使用的。我只是在寻找最简单的方法来运行远程命令/进程,并从这些远程系统接收响应消息。

设计一个跨平台的通信接口

我使用ZMQ和JSON正是为了这个目的:创建一个自定义的私有网络拓扑,该拓扑使用TCP(通过ZMQ)上的JSON消息进行通信。当然,您可以使用任何序列化格式(我在下面列出了一些备选方案)。

我不能给你一个明确的"这是你应该做的"的答案,因为这个问题是相当开放的。

  • ZMQ: http://www.zeromq.org/
    • 非常好的跨平台抽象套接字库
    • 可以使用多种传输协议,包括TCP
    • 将消息作为普通字节数组发送,让您选择序列化格式
  • 一些序列化格式(按个人喜好排序):
    • JSON: http://www.json.org/
    • MessagePack: http://msgpack.org/
      完全像JSON,但更紧凑
      没有模式
      跨平台的
    • Google Protocol Buffers: https://code.google.com/p/protobuf/
      使用模式
      有c++, c#, Java, Python(至少)的绑定

这实际上取决于您正在使用的基础设施和服务。如果您在Amazon Web Services领域,您可以使用简单队列服务(Simple Queue Service, SQS)来接收消息。然后,远程系统可以轮询队列,并基于从SQS队列中取出的消息运行作业。

相关文章: