Qt IPC 进程间通信 的简单使用 QLocalServer与QLocalSocket


服务端

 1 #include <QApplication>
 2 #include <QtNetwork>
 3 
 4 class CServer
 5     : public QObject
 6 {
 7     Q_OBJECT
 8 public:
 9     CServer()
10         : m_server(NULL)
11     {
12         m_server = new QLocalServer(this);
13         QObject::connect(m_server, SIGNAL(newConnection()), this, SLOT(serverNewConnectionHandler()));
14     }
15 
16     ~CServer()
17     {
18         m_server->close();
19 
20         delete m_server;
21     }
22 
23     void RunServer()
24     {
25         qDebug() << "Run Server ok";
26 
27         QLocalServer::removeServer("ServerName");
28         bool ok = m_server->listen("ServerName");
29         if (!ok)
30         {
31             // TODO:
32         }
33     }
34 
35 private slots:
36     void serverNewConnectionHandler()
37     {
38         qDebug() << "New Connection";
39 
40         QLocalSocket* socket = m_server->nextPendingConnection();
41         QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(socketReadyReadHandler()));
42         QObject::connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
43     }
44 
45     void socketReadyReadHandler()
46     {
47         QLocalSocket* socket = static_cast<QLocalSocket*>(sender());
48         if (socket)
49         {
50             QTextStream stream(socket);
51             qDebug() << "Read Data From Client:" << stream.readAll();
52 
53             QString response = "Hello Client";
54             socket->write(response.toUtf8());
55             socket->flush();
56         }
57 
58         // 返回到客户端的void sendMessage方法,m_socket->waitForReadyRead()之后的操作
59     }
60 
61 private:
62     QLocalServer *m_server;
63 };
64 
65 int main(int argc, char *argv[])
66 {
67     // 至qt4.8(以上的不知道),在window下QApplication
68     // 必需放到QLocalServer创建之前
69     // 参考地址:http://www.qtcentre.org/archive/index.php/t-43522.html?s=26444975027844d43142ce2238f4605e
70     QApplication app(argc, argv);
71 
72     CServer server;
73     server.RunServer();
74 
75     return app.exec();
76 }
77 
78 #include "main.moc"

 

 客户端

 1 #include <QApplication>
 2 #include <QtNetwork>
 3 
 4 class CClient
 5     : public QObject
 6 {
 7     Q_OBJECT
 8 public:
 9     CClient()
10         : m_socket(NULL)
11     {
12         m_socket = new QLocalSocket();
13 
14         QObject::connect(m_socket, SIGNAL(connected()), this, SLOT(socketConnectedHandler()));
15         QObject::connect(m_socket, SIGNAL(disconnected()), this, SLOT(socketDisConnectedHandler()));
16         QObject::connect(m_socket, SIGNAL(error(QLocalSocket::LocalSocketError)), this, SLOT(socketErrorHandler(QLocalSocket::LocalSocketError)));
17     }
18 
19     ~CClient()
20     {
21         m_socket->disconnectFromServer();
22 
23         delete m_socket;
24     }
25 
26 public:
27     void ConnectToServer(const QString &strServerName)
28     {
29         // 服务端的serverNewConnectionHandler成员方法将被调用
30         m_socket->connectToServer("ServerName");
31         if (m_socket->waitForConnected())
32         {
33             // TODO:
34         }
35     }
36 
37     void sendMessage(const QString &msg)
38     {
39         m_socket->write(msg.toStdString().c_str());
40         m_socket->flush();
41 
42         // waitForReadyRead将激发信号readyRead(), 我们在
43         // 与服务端创建连接时,已将readyRead(),绑定到了服务
44         // 端的槽socketReadyReadHandler成员方法
45         if (!m_socket->bytesAvailable())
46             m_socket->waitForReadyRead();    
47 
48         QTextStream stream(m_socket);
49         QString respond = stream.readAll();
50 
51         qDebug() << "Read Data From Server:" << respond;
52     }
53 
54 private slots:
55     void socketConnectedHandler()
56     {
57         qDebug() << "connected.";
58     }
59 
60     void socketDisConnectedHandler()
61     {
62         qDebug() << "disconnected.";
63     }
64 
65     void socketErrorHandler(QLocalSocket::LocalSocketError error)
66     {
67         qWarning() << error;
68     }
69 
70 private:
71     QLocalSocket *m_socket;
72 };
73 
74 int main(int argc, char *argv[])
75 {
76     // 至qt4.8(以上的不知道),在window下QApplication
77     // 必需放到QLocalServer创建之前
78     // 参考地址:http://www.qtcentre.org/archive/index.php/t-43522.html?s=26444975027844d43142ce2238f4605e
79     QApplication app(argc, argv);
80 
81     CClient client;
82     client.ConnectToServer("ServerName");
83 
84     client.sendMessage("Hellow Server");
85 
86     return app.exec();
87 }
88 
89 #include "main.moc"

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM