QIODevice做為QLocalSocket的父類
在Qt中,提供了多種IPC方法。看起來好像和Socket搭上點邊,實則底層是windows的name pipe。這應該是支持雙工通信的
QLocalServer提供了一種基於本地套接字的服務器,實現了接收本地socket的連接的功能。
通過調用listen()監聽特定的連接,每次與client連接上時發出newConnection()信號。
通過調用nextPendingConnection()響應一個等待中的連接請求,返回一個指針,指向用於與client建立通信的QLocalSocket。
當連接發生錯誤時,serverError() 返回錯誤的類型,通過調用errorString()可以獲取錯誤描述。
監聽過程中,serverName()可獲取當前服務器的名稱。
調用close()停止對連接請求的監聽。
雖然QLocalServer是為在事件循環中使用而設計出來的,但是在沒有事件循環時也是可以使用的。
沒有事件循環時,你必須使用waitForNewConnection(),它只在以下兩種情況下解除阻塞:1)有可用的連接;2)超時。
服務器
#ifndef SERVER_H #define SERVER_H #include <QWidget> #include <QObject> #include <QLocalSocket> #include <QLocalServer> class CServer : public QObject { Q_OBJECT public: CServer() : m_server(NULL) { m_server = new QLocalServer; connect(m_server, SIGNAL(newConnection()), SLOT(serverNewConnectionHandler())); } ~CServer() { m_server->close(); delete m_server; } void RunServer() { qDebug() << "Run Server ok"; QLocalServer::removeServer("ServerName"); bool ok = m_server->listen("ServerName"); if (!ok) { // TODO: } } private slots: void serverNewConnectionHandler() { qDebug() << "New Connection"; qDebug() << "listen: " << m_server->serverName(); QLocalSocket* socket = m_server->nextPendingConnection(); connect(socket, SIGNAL(readyRead()), this, SLOT(socketReadyReadHandler())); connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater())); } void socketReadyReadHandler() { QLocalSocket* socket = static_cast<QLocalSocket*>(sender()); if (socket) { QTextStream stream(socket); qDebug() << "Read Data From Client:" << stream.readAll(); QString response = "Hello Client"; socket->write(response.toUtf8()); socket->flush(); } // 返回到客戶端的void sendMessage 方法,m_socket->waitForReadyRead()之后的操作 } private: QLocalServer *m_server; }; #endif // SERVER_H #include "server.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); CServer server; server.RunServer(); return a.exec(); }
客戶端
#ifndef CLIENT_H #define CLIENT_H #include <QObject> #include <QLocalSocket> #include <QLocalServer> class CClient : public QObject { Q_OBJECT public: CClient() : m_socket(NULL) { m_socket = new QLocalSocket(); connect(m_socket, SIGNAL(connected()), SLOT(socketConnectedHandler())); connect(m_socket, SIGNAL(disconnected()), SLOT(socketDisConnectedHandler())); connect(m_socket, SIGNAL(error(QLocalSocket::LocalSocketError)), SLOT(socketErrorHandler(QLocalSocket::LocalSocketError))); } ~CClient() { m_socket->disconnectFromServer(); delete m_socket; } public: void ConnectToServer(const QString &strServerName) { // serverNewConnectionHandler 成員方法將被調用 m_socket->connectToServer(strServerName); if (m_socket->waitForConnected()) { // TODO: } } void sendMessage(const QString &msg) { m_socket->write(msg.toStdString().c_str()); m_socket->flush(); if (!m_socket->bytesAvailable()) m_socket->waitForReadyRead(); QTextStream stream(m_socket); QString respond = stream.readAll(); qDebug() << "Read Data From Server:" << respond; } private slots: void socketConnectedHandler() { qDebug() << "connected."; } void socketDisConnectedHandler() { qDebug() << "disconnected."; } void socketErrorHandler(QLocalSocket::LocalSocketError error) { qWarning() << error; } private: QLocalSocket *m_socket; }; #endif // CLIENT_H #include "client.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); CClient client; client.ConnectToServer("ServerName"); client.sendMessage("Hellow Server"); return a.exec(); }
學習地址https://blog.csdn.net/yhc166188/article/details/80756448