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/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

发表回复

登录后才能评论