Qt中的QLocalSocket:本地套接字的應用

一、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參數表示連接模式,它可以是ReadWriteReadOnly,默認值為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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:53
下一篇 2024-12-12 12:53

相關推薦

  • Qt雷達探測教程

    本文主要介紹如何使用Qt開發雷達探測程序,並展示一個簡單的雷達探測示例。 一、環境準備 在開始本教程之前,需要確保你的開發環境已經安裝Qt和Qt Creator。如果沒有安裝,可以…

    編程 2025-04-29
  • Qt State Machine與狀態機模式

    本文將介紹Qt State Machine和狀態機模式在Qt中的實現。Qt提供了QStateMachine和QState兩個類,可以方便地實現狀態機模式,並且能有效地處理複雜的、多…

    編程 2025-04-27
  • Python中的Qt庫

    Qt庫是一個跨平台的C++圖形用戶界面(GUI)工具包。它提供了豐富的界面控件和處理系統事件的功能,可以輕鬆創建交互界面、圖形化應用和多媒體應用。而Python中的Qt庫則是Qt的…

    編程 2025-04-27
  • xmake qt:構建Qt應用的全流程解決方案

    本文將會詳細闡述xmake qt的使用方法以及其能夠解決的問題。針對Qt應用開發中的各種困境,xmake提供了一整套的解決方案,包括自動構建、依賴管理、部署打包等,極大地提高了開發…

    編程 2025-04-27
  • Qt延時函數詳解

    一、概述 Qt提供了多種延時函數,用於實現程序中需要暫停一段時間的功能。Qt的延時函數分為線程休眠(sleep())、定時器(QTimer)和事件循環(QEventLoop)三種方…

    編程 2025-04-25
  • Qt 自定義控件詳解

    一、Qt自定義控件簡介 Qt是一種用於開發跨平台軟件的應用程序框架,它提供了一組用於構建用戶界面、網絡應用程序和數據庫等方面的工具。 Qt自定義控件是指在當前控件基礎上進行一定修改…

    編程 2025-04-23
  • Qt foreach用法詳解

    一、foreach概述 Qt的foreach是一個非常方便且易於使用的迭代器。它能夠迭代遍歷一個集合中的所有元素,無需我們手動指定迭代器的起始位置和終止位置,也無需編寫while循…

    編程 2025-04-23
  • 深入解析Qt中的QMutexLocker

    一、QMutexLocker是什麼 QMutexLocker是Qt中一個用於簡化QMutex鎖定和解鎖的便利類。QMutex是一個同步原語,可以用於在線程之間協調對共享數據的訪問。…

    編程 2025-04-23
  • QT USB通信詳細介紹

    一、USB通信的介紹 USB(Universal Serial Bus)是一種全新的、高速的、熱插拔、雙向傳輸的外部總線標準。在這種傳輸方式下,一個計算機上最多能插置127台USB…

    編程 2025-04-23
  • 深入了解Qt Xlsx

    一、Qt Xlsx是什麼 Qt Xlsx是一個基於Qt的開源項目,用於向Microsoft Excel 2007/2010/2013/2016添加功能。它允許用戶讀取和寫入.xls…

    編程 2025-04-23

發表回復

登錄後才能評論