一、QLocalSocket簡介
QLocalSocket是Qt的一種系統級套接字(socket),它允許使用本地文件名來創建一種專有協議,而不是使用網絡地址和端口等信息來標識連接。通常情況下,QLocalSocket在同一台機器上的進程之間用於進行進程間通訊(Inter-Process Communication,IPC)。
二、QLocalSocket的基礎使用
要使用QLocalSocket,首先需要創建一個對象(實例),其構造函數如下:
QLocalSocket(QObject* parent = nullptr)
在創建實例之後,需要調用connectToServer()
函數來連接本地服務端,其原型如下:
void connectToServer(const QString& name, OpenMode openMode = ReadWrite);
其中,name
參數表示要連接的本地服務端名字,openMode
參數表示連接模式,它可以是ReadWrite
或ReadOnly
,默認值為ReadWrite
。連接建立後,可以使用isWritable()
函數判斷是否可寫,使用write()
函數寫入數據。
下面展示一個示例代碼:
#include <QLocalSocket>
#include <QDebug>
int main(int argc, char *argv[])
{
QLocalSocket socket;
socket.connectToServer("myserver");
if (socket.waitForConnected()) {
qDebug() << "Connected to server";
socket.write("Hello server");
if (socket.waitForBytesWritten())
qDebug() << "Data written";
} else {
qDebug() << "Failed to connect to server";
}
}
三、QLocalSocket的高級應用
1. 服務端示例
下面是一個服務端的示例代碼,它創建了一個本地服務端並監聽客戶端發來的請求:
#include <QLocalServer>
#include <QLocalSocket>
#include <QDebug>
int main(int argc, char *argv[])
{
QLocalServer server;
server.listen("myserver");
while (server.isListening()) {
if (server.waitForNewConnection()) {
QLocalSocket* socket = server.nextPendingConnection();
qDebug() << "Received connection:" << socket->peerName();
QByteArray data = socket->readAll();
qDebug() << "Data from client:" << data;
socket->write("Hello client");
socket->flush();
socket->waitForBytesWritten();
socket->waitForDisconnected();
delete socket;
}
}
return 0;
}
在這個示例中,服務端先調用listen()
函數來創建一個本地服務端,同樣使用了一個字符串“myserver”作為服務端的唯一標識。接着,服務端通過使用waitForNewConnection()
函數等待新的客戶端連接,並使用nextPendingConnection()
函數獲取客戶端連接的QLocalSocket對象。之後,服務端讀取客戶端發來的數據並返回一個字符串“Hello client”。
2. 客戶端示例
下面是一個客戶端的示例代碼,它連接到上面創建的負責監聽的本地服務端並發送一個字符串“Hello server”,然後等待服務端返回數據:
#include <QLocalSocket>
#include <QDebug>
int main(int argc, char *argv[])
{
QLocalSocket socket;
socket.connectToServer("myserver");
if (socket.waitForConnected()) {
qDebug() << "Connected to server";
socket.write("Hello server");
socket.flush();
socket.waitForBytesWritten();
socket.waitForReadyRead();
qDebug() << "Data from server:" << socket.readAll();
socket.disconnectFromServer();
} else {
qDebug() << "Failed to connect to server";
}
return 0;
}
在這個示例中,客戶端使用connectToServer()
函數連接到上面創建的服務端並發送一個字符串“Hello server”。
在向服務端發送數據後,需要通過flush()
函數刷新緩衝區,然後通過waitForBytesWritten()
函數等待寫入數據完成。接着,使用waitForReadyRead()
函數等待從服務端返回的數據,並使用readAll()
函數獲取數據內容。最後,客戶端通過disconnectFromServer()
函數斷開連接。
四、QLocalSocket的應用場景
QLocalSocket用於同一台機器上進程間通訊是非常實用的,比如:服務端控制多個客戶端的信息傳遞。它還可以作為調試工具,用於探測系統中正在運行的進程是否存在,並給它們發送消息。
下面展示一個示例代碼,客戶端向服務端發送特定的消息,從而通知服務端殺死指定的進程:
// 服務端代碼
void killProcess(const QString& processName)
{
QProcess process;
process.start("pkill", QStringList() << processName);
}
int main(int argc, char *argv[])
{
QLocalServer server;
server.listen("myserver");
while (server.isListening()) {
if (server.waitForNewConnection()) {
QLocalSocket* socket = server.nextPendingConnection();
qDebug() << "Received connection:" << socket->peerName();
QByteArray data = socket->readAll();
if (data == "kill processX") {
killProcess("processX");
} else if (data == "kill processY") {
killProcess("processY");
}
socket->disconnectFromServer();
delete socket;
}
}
return 0;
}
// 客戶端代碼
int main(int argc, char *argv[])
{
QLocalSocket socket;
socket.connectToServer("myserver");
if (socket.waitForConnected()) {
qDebug() << "Connected to server";
socket.write("kill processX");
socket.flush();
socket.waitForBytesWritten();
socket.disconnectFromServer();
} else {
qDebug() << "Failed to connect to server";
}
return 0;
}
在這個示例中,服務端監聽客戶端的連接,等待客戶端發送的消息。如果客戶端發送的消息為“kill processX”或“kill processY”,服務端就會用pkill
命令殺死對應的進程。客戶端連接到服務端後,發送一條命令“kill processX”給服務端,然後斷開連接。
五、總結
QLocalSocket是Qt中用於實現本地套接字(socket)的類,它可以用於同一台機器上進程間通訊。使用QLocalSocket連接服務端可以通過調用connectToServer()
函數,連接建立後可以通過write()
函數寫入數據。服務端通過等待新客戶端連接並接收數據,可以使用listen()
函數創建本地服務端並通過waitForNewConnection()
函數等待新的客戶端連接。
QLocalSocket在本地套接字的應用場景中使用廣泛,它可以作為進程間通訊的工具,也可以作為調試工具來探測系統中運行的進程是否存在,並向它們發送消息。在實際開發過程中,可以根據應用需求選取合適的參數,利用QLocalSocket輕鬆實現進程間通訊。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/242937.html