云平台开发架构分析系列:24 远程控制的两个服务器间的进程间通信实现

1525 人浏览 | 时间: 2017-07-15 01:24:36 | 作者: codexia 会员文章,禁止转载

发现一个程序员专属的导航网站,你肯定不知道,是时候告诉你了,请前去看看吧

    在《云平台开发架构分析系列23:远程控制设备的实现基础》中,我们已经了解了整个云平台的控制流程。现在要具体讲述下最后一个关键的通信环节,即两个服务器间的进程间通信。
    为了提高效率,我们在TCP服务器程序开发时,写了一套基础类库,方便后续的编程。而在实现web服务器程序与TCP服务器程序的进程间通信,我们直接将通信的实现代码,封装在动态库中,提供给python调用即可。这样一来,我们只需要用C++代码实现进程间的通信,这样代码两部分的代码统一,以可以避免参数不匹配问题。毕竟不同的语言在处理参数的传递时,如果直接进行参数的处理,会比较麻烦。另外,使用C++来实现进程间通信,两边的代码是一致的,也不需要写两套代码,只需要微调一下就可以了。
    在Windows下用C++写python动态库的方法,见:Windows下使用C++编写Python的扩展模块详细说明
    在Linux下用C++写python动态库的方法,见:Linux下C++编写Python扩展模块和Python调用so动态库

    写好的动态库,放在python的动态库目录下即可。而在python中只需要简单导入动态库,然后直接调用函数即可。
    本文是云平台开发架构分析系列最后一篇文章,也是非常关键的一篇文章。正是由于进程间的通信,才将两条通信链路打通,从而为云平台打开了广袤的想象空间。我们这里也就是将你引导到云平台开发的开始,以后的路需要由你自己继续往下走。在这个基础上,你可以实现各种远程控制,不要说控制家里的空调电冰箱了,你要去控制导弹都可以,哈哈。导弹就是一个设备端即TCP客户端。手机一点,就可以发射导弹,这感觉是不是贼爽。想象空间是无限的,你要怎么做,就是业务处理了。只要提供不同的api即写不同的python脚本(或者你配置其他的服务器使用其他语言实现api也行),支持不同的控制功能。然后在设备端实现对应的命令的响应,再由本文即将讲的进程间通信,将命令由web服务器发到TCP服务器,就完成了整个通路了。
    我现在实现的版本是Linux版本,所以通过一番选择,选中了消息队列。而管道则比较原始,无法满足我的要求。因为我要实现两组控制命令,再加上命令回复,一共有四个命令。为了方便命令的识别,我们使用命令ID。消息队列的模型,正好给我们提供了一个消息ID,这个消息ID正好可以当做我们的命令ID,这样消息队列就可以自动实现命令ID的过滤提取,我们就不用为这个费心了。
    当然,进程间还有很多通信机制,选择合适自己的或者自己喜欢的,就好了。
    这个消息队列作为两个进程的通信介质,需要在服务器启动的时候就存在。而每次发起web端的restful api调用,是执行了一次python脚本,创建了一个临时的进程来处理。这个临时进程在处理完通信之后,就会关闭。而TCP服务器进程创建之后就要一直运行着。所以我们自然而然要在TCP服务器程序启动的时候建立这个消息队列。当TCP服务器程序启动的时候,就会建立单独的线程,而线程运行的时候也就会创建消息队列。此时必然是没有web端的api调用的,所以一般都是TCP服务器这边创建了消息队列。
    linux中创建消息队列的函数是:msgget。在第二个参数中传递IPC_CREAT,如果消息队列不存在就会创建消息队列,如果存在就直接获取。示例代码如下:
int msgid = msgget((key_t)MSG_QUEUE_ID, 0666 | IPC_CREAT);
    返回的值是消息队列的ID,在后续的消息的发送函数和接受函数都会用到。而msgget的第一个参数是作为我们消息队列的键,相当于我们的消息队列的名称。正是这个名称,对于系统中其他进程来说都是可以利用的。其他进程可以通过这个名称来获取我们这个消息队列的ID。这样就实现了消息队列的共享。如果其他进程不知道我们消息队列的名称,那就无法找到这个消息队列
开通会员付1C币>>阅读全文
标注
评论
站内搜
百度搜
传送到手机
手机扫码,识别文字,完成传送x
加载中...
标注内容x
加载中...
添加标注x
收藏 0 点赞 0

相关阅读