基于 QLocalSocket 、QLocalServer 的进程间通信。

基础:

QLocalSocket 是本地 socket client 端,在 windows 里是用有名管道实现的,在 unix 里是本地域名socket实现的。
QLocalSocket 是事件驱动的,但也可以通过 waitFor… 系列方法阻塞使用。

QLocalServer 提供了本地 socket server 端。跟一般的 socket 使用方式类似:创建 对象,listen,wait connect。
QLocalServer 是事件驱动的,但也可以通过 waitFor… 系列方法阻塞使用。

原理:

进程启动后,先创建 QLocalSocket client 端尝试连接 server 端。
如果 server 端存在,说明有一个进程在运行了,然后就解析 command line,将 命令通过 socket 发送给已经连接的 server ,待 server 端收到后,本进程退出。
如果 server 端不存在,说明本进程是唯一进程。那么就自己处理 command line,创建 QLocalServer 作为 server 端,等待 client 连接。

进程运行时,有一个 QLocalServer listen client,当有 QLocalSocket client 接入时,监听 readyRead() 信号,然后读取 client 发来的 data,做对应的 处理。

协议对接:

协议格式:【operate】:【data】;
CMD,发送操作指令,主要用来将最小化的进程弹出且前置显示。格式为:“CMD:show”
SEND, 发送文件路径,主要是 鼠标 右键菜单里的 发送 功能。格式为:“SEND:【文件路径】;”
OPEN,
ToPhone,自动加好友,老实现,准备废弃。格式为:“ToPhone:【手机号】;”
RES,server 端收到 client 端 data 后,写给 client 的回执。格式为:“RES:【已运行的进程 id】”;

核心点:

1、QLocalSocket client 端可以一次性写入所有 data,但 QLocalServer server 端未必能一次性全收到。
2、QLocalSocket client 端写入之后,什么时候本进程可以退出。
3、特殊字符如何处理。

实现:
1、client 端不用管。server 端在 client 端接入后,把 client 保存起来,然后将所有从 client 端读入的数据 append 到一起,每次读入都按照协议格式检查一下是否收到了完整的命令,如果收到了则将命令从 数据里移除掉,避免重复处理。
2、client 在每次写入命令后 都会加上 CMD:show 用来把进程前置显示,server 端在收到后 CMD:show 后,给 client 写入 respones,client 收到 response 后说明 server 已经接收了命令,就可以退出了。
client 的链接如果断开,也可以退出了。
3、每个完整指令都是通过 “;” 分割,只要保证 operate 和 data 不会包含 “;” 就行了, operate 为协议指令、事先写死硬编码的、不用特殊处理,data 可能包含 “;”,但只要 base64 处理一下就行了。

伪码:

client 代码:

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值