设计一个跨平台的通信接口
本文关键字:一个 跨平台 通信接口 | 更新日期: 2023-09-27 18:17:07
我有一个在本地系统上运行的c#程序,它需要能够做两件事。
- 在运行Windows、Linux或Android的远程系统上异步剥离远程作业。
- 为这些系统提供一种将这些作业的输出(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队列中取出的消息运行作业。