Qt進程間通信及簡單例子

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不依賴第三方的庫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章