日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QLocalServer和QLocalSocket单进程和进程通信

發布時間:2024/7/5 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QLocalServer和QLocalSocket单进程和进程通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

QLocalServer

繼承自QObject。

QLocalServer提供了一個基于本地套接字(socket)的服務端(server)。
QLocalServer可以接受來自本地socket的連接。
server通過調用listen(),監聽特定的連接。
newConnection()是在每次server與client連接上時所發出的信號。
nextPendingConnection()將等待中的連接當作一個已連接上的QLocalSocket。返回值是指向QLocalSocket的指針,這個QLocalSocket可以與client建立通信。
當發生錯誤時,serverError() 返回錯誤的類型,調用errorString()可以獲取對錯誤的描述。
在監聽過程中,通過 serverName()可以獲取當前server監聽的名稱。
close()使QLocalServer停止對連接請求的監聽。
雖然QLocalServer是為在事件循環中使用而設計出來的,但是在沒有事件循環時也是可以使用的。沒有事件循環時,你必須使用waitForNewConnection(),它只在以下兩種情況下解除阻塞:1)有可用的連接;2)超時。

?

1. 建立一個QLocalServer實例 m_server

2. 進行listen :? ? ? ? ? ? ? ? ? ? ? ? ?

?m_server->listen("servername")

?

3. 當有連接到來時,QLocalServer會發送netConnection()信號,所以進行信號連接, 在init()函數中:

? connect(m_server,?SIGNAL(newConnection()),?this,?SLOT(newConnection()));

?

4.在newConnection()函數中取得連接客戶端的QLocalSocket

QLocalSocket?*newsocket?=?m_server->nextPendingConnection();

5.當QLocalSocket可以讀數據時它會發送readyRead()信號,所以對newsocket進行信號連接, 在newConnection()函數中: ?connect(newsocket,?SIGNAL(readyRead()),?this,?SLOT(readyRead())); 6.在readyRead()函數中讀取數據: // 取得是哪個localsocket可以讀數據了QLocalSocket *local = static_cast<QLocalSocket *>(sender()); if (!local)return;QTextStream in(local);QString readMsg;// 讀出數據readMsg = in.readAll();

  

全部代碼, server端: 全部代碼, server端://// // server.h / #ifndef SERVER_H #define SERVER_H #include <QLocalServer> #include <QLocalSocket> class Server : public QObject {Q_OBJECT public:Server(){m_server = 0;} ~Server(){if (m_server) {delete m_server;}}int init(const QString & servername){// 如果已經有一個實例在運行了就返回0if (isServerRun(servername)) {return 0;}m_server = new QLocalServer;// 先移除原來存在的,如果不移除那么如果// servername已經存在就會listen失敗 QLocalServer::removeServer(servername);// 進行監聽m_server->listen(servername);connect(m_server, SIGNAL(newConnection()), this, SLOT(newConnection()));return 1;} private slots:// 有新的連接來了void newConnection(){QLocalSocket *newsocket = m_server->nextPendingConnection(); connect(newsocket, SIGNAL(readyRead()), this, SLOT(readyRead()));} // 可以讀數據了void readyRead(){// 取得是哪個localsocket可以讀數據了QLocalSocket *local = static_cast<QLocalSocket *>(sender()); if (!local)return;QTextStream in(local);QString readMsg;// 讀出數據readMsg = in.readAll();// 發送收到數據信號 emit newMessage(readMsg);} private:// 判斷是否有一個同名的服務器在運行int isServerRun(const QString & servername){// 用一個localsocket去連一下,如果能連上就說明// 有一個在運行了 QLocalSocket ls;ls.connectToServer(servername);if (ls.waitForConnected(1000)){// 說明已經在運行了 ls.disconnectFromServer();ls.close();return 1;}return 0;} signals:void newMessage(const QString &msg); private:QLocalServer *m_server; }; #endif // SERVER_H /// /// main.cpp /// #include <QApplication> #include <QLabel> #include <QMessageBox> #include "server.h" int main(int argc, char **argv) {QApplication app(argc, argv);QLabel text("teststts");Server s;if (!s.init("localserver-test")){// 初使化失敗, 說明已經有一個在運行了QMessageBox::information(&text, "info", "There is already exist one!"); return 1;}QObject::connect(&s, SIGNAL(newMessage(const QString &)),&text, SLOT(setText(const QString &)));text.show();return app.exec(); }

?

用于測試的客戶端代碼, 每一秒向server發送一個隨機數: 用于測試的客戶端代碼, 每一秒向server發送一個隨機數:#include <QLocalSocket> #include <stdlib.h> #include <unistd.h>int main(int argc, char **argv) {QLocalSocket ls;ls.connectToServer("localserver-test");srandom(1000);if (ls.waitForConnected()){while (1){QTextStream ts(&ls);ts << QString::number(random()) + "\nTTTTTTTTTT" + "\nXXXXXXXX";ts.flush();ls.waitForBytesWritten();sleep(1);}}return 0; }

?

轉載于:https://www.cnblogs.com/wangjian8888/p/10071600.html

總結

以上是生活随笔為你收集整理的QLocalServer和QLocalSocket单进程和进程通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。