Qt提供了幾種在Qt應用程序中實現進程間通信(IPC)的方式。
1. TCP/IP
跨平臺的QtNetwork模塊提供了可以簡單實現網絡編程的類。它提供了特定的應用層協議通信的高級別的類(像QNetworkAccessManager,QFtp)和低等級的類(像QTcpSocket,QTcpServer,QSslSocket)。
Qt4.4以後增加了QLocalServer和QLocalSocket兩個本地套接字類,可以用於進程間通信。這兩個類是事件循環驅動的,同時也提供WaitForxxx.....等一系列阻塞的方法。
Server端程序
頭文件
#ifndef LOCALSERVER_H
#define LOCALSERVER_H
#include <QObject>
#include <QLocalServer>
#include <QLocalSocket>
class LocalServer : public QObject
{
Q_OBJECT
public:
explicit LocalServer(QObject *parent = 0);
~LocalServer();
private slots:
void processNewConnection();
void disconnect();
void readData();
private:
QLocalServer *server;
};
#endif // LOCALSERVER_H
Server端cpp文件
#include <QDebug>
#include <QFileInfo>
#include <QDataStream>
#include <syslog.h>
#include "localserver.h"
#define SERVER_NAME "InterProcessCom"
#define IPC_RECV_BUF_LEN (1024)
LocalServer::LocalServer(QObject *parent) : QObject(parent)
{
qDebug() << "LocalServer construct";
server = new QLocalServer(this);
QLocalServer::removeServer(SERVER_NAME);
if(!server->listen(SERVER_NAME))
{
qDebug() << "server listen failed!" << server->errorString();
}
connect(server, SIGNAL(newConnection()), this, SLOT(processNewConnection()));
}
LocalServer::~LocalServer()
{
if(server != NULL)
{
server->close();
delete server;
server = NULL;
}
}
void LocalServer::processNewConnection()
{
qDebug() << "LocalServer processNewConnection";
QLocalSocket *clientConnection = server->nextPendingConnection();
localSocketList.append(clientConnection);
connect(clientConnection, SIGNAL(readyRead()),
this, SLOT(readData()));
connect(clientConnection, SIGNAL(disconnected()),
this, SLOT(disconnect()));
}
void LocalServer::disconnect()
{
for(int i = 0; i < localSocketList.size(); i++)
{
if(localSocketList.at(i)->state() != QLocalSocket::ConnectedState)
{
localSocketList.at(i)->deleteLater();
localSocketList.removeAt(i);
}
}
qDebug() << "after disconnect localSocketList size:" << localSocketList.size();
}
void LocalServer::readData()
{
QLocalSocket *local = static_cast<QLocalSocket*>(sender());
if (!local)
return ;
// local->read();
}
客戶端程序
頭文件
#ifndef LOCALCLIENT_H
#define LOCALCLIENT_H
#include <QObject>
#include <QLocalSocket>
class LocalClient : public QObject
{
Q_OBJECT
public:
explicit LocalClient(QObject *parent = 0);
~LocalClient();
private:
QLocalSocket *socket;
private slots:
void readData();
void displayError(QLocalSocket::LocalSocketError socketError);
};
#endif // LOCALCLIENT_H
cpp文件
#include <QDataStream>
#include <syslog.h>
#include "localclient.h"
#define SERVER_NAME "InterProcessCom"
#define IPC_RECV_BUF_LEN (1024)
LocalClient::LocalClient(QObject *parent) : QObject(parent)
{
socket = new QLocalSocket(this);
connect(socket, SIGNAL(readyRead()), this, SLOT(readData()));
connect(socket, SIGNAL(error(QLocalSocket::LocalSocketError)),
this, SLOT(displayError(QLocalSocket::LocalSocketError)));
socket->abort();
socket->connectToServer(SERVER_NAME);
}
LocalClient::~LocalClient()
{
if(socket != NULL)
{
socket->abort();
delete socket;
socket = NULL;
}
}
void LocalClient::readData()
{
// socket->read();
}
void LocalClient::displayError(QLocalSocket::LocalSocketError socketError)
{
switch (socketError) {
case QLocalSocket::ServerNotFoundError:
break;
case QLocalSocket::ConnectionRefusedError:
break;
case QLocalSocket::PeerClosedError:
break;
default:
break;
}
}
2.Shared Memory
Qt提供了跨平臺的QSharedMemory類,QSharedMemory提供了一系列操作系統共享內存的方法。此外,QSystemSemaphore可用於控制對系統共享資源的訪問,以及在進程之間進行通信。
3.DBus
QDBus模塊只能用在Unix環境,它把Qt的信號和槽機制擴展到了進程間通信,可以把一個進程的信號連接到另一個進程的槽。
4.Qt COmmunications Protocol (QCOP)
QCopChannel 類實現了一種通過命名管道在進程間傳遞消息的協議。QCopChannel只能用在嵌入式Linux。像QDbus模塊一樣,QCopChannel也把信號和槽機制擴展到了進程間通信,不過和QDbus模塊不同的是,QCOP不依賴第三方的庫。