QT January 15, 2020

【QT】进程间通信 -- QLocalServer/QLocalSocket(命名管道)

Words count 4.7k Reading time 4 mins. Read count 0

前言

现在在逐步将项目中的功能块,这样子可以针对不同用户需求,灵活启用或卸载部分功能。目前,我们采用的方案是将功能打包成独立的exe,在启用时通过进程间通信进行交互。这里就涉及到进程间通信的技术,常用的技术有几种:

  1. TCP/IP
  2. 共享内存
  3. QProcess
  4. 命名管道
    这里主要介绍命名管道的使用

步骤

QLocalServer(服务端)

  1. 创建QLocalServer
  2. 调用server的listen(“a specified key”)函数进行监听新的连接
  3. 接收server发送的newConnection信号
  4. 调用server的nextPendingConnection()函数来获取一个连接的QLocalSocket对象
  5. 接收该QLocalSocket对象发射的三种信号进行业务处理:readyRead、socketError和disconnected

QLocalSocket(客户端)

  1. 创建QlocalSocket
  2. 调用socket的connectToServer(“a specified key : 与上边server的key保持一致”)函数进行连接
  3. 接收该socket发射的readyRead信号处理交互的数据

具体代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// 1. 服务端
m_server = new QLocalServer(this);
connect(m_server, SIGNAL(newConnection()), this, SLOT(newConnection()));
m_server->listen("a specified key");

void Server::newConnection()
{
QLocalSocket *socket = m_server->nextPendingConnection();
if ((nullptr != socket) && (QAbstractSocket::ConnectedState == socket->state()))
{
connect(socket, SIGNAL(disconnected()), this, SLOT(disconnected()));
connect(socket, SIGNAL(error(QLocalSocket::LocalSocketError)), this, SLOT(socketError(QLocalSocket::LocalSocketError)));
connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
}
}

void Server::disconnected()
{
// 连接中断的业务处理
}

void Server::socketError(QLocalSocket::LocalSocketError error)
{
// 通信出错的业务处理
}

void Server::readyRead()
{
// 处理来自客户端的数据
}


// 2. 客户端
m_socket = new QLocalSocket(this);
connect(m_socket, SIGNAL(disconnected()), this, SIGNAL(disconnected()));
connect(m_socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
m_socket->connectToServer("WisdomClassIPC");

void IPCClient::readyRead()
{
// 处理来自服务端的数据
}
0%