QLocalSocket与QLocalServer简单演示本地进程通信

Qt中这种类似socket的手法,实质上是通过命名管道来实现的。演示代码很简单:

client.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLocalSocket>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    QLocalSocket*client;
private slots:
    void on_connected();
    void on_disconnected();
};

#endif // WIDGET_H

client.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    client = new QLocalSocket(this);
    connect(client,SIGNAL(connected()),this,SLOT(on_connected()));
    connect(client,SIGNAL(disconnected()),this,SLOT(on_disconnected()));
    client->connectToServer("testtest");
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_connected()
{
    QString a("i am client");
    client->write(a.toLatin1());
    client->flush();
}

void Widget::on_disconnected()
{
    qDebug()<<"on_disconnected";
}

server.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLocalServer>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    QLocalServer *server;

private slots:
    void on_connected();
    void on_readyRead();
};

#endif // WIDGET_H

server.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QLocalSocket>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    server = new QLocalServer(this);
    connect(server,SIGNAL(newConnection()),this,SLOT(on_connected()));

    server->listen("testtest");

}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_connected()
{
    QLocalSocket *client = server->nextPendingConnection();
    connect(client,SIGNAL(readyRead()),this,SLOT(on_readyRead()));

}

void Widget::on_readyRead()
{
   QLocalSocket *client = static_cast<QLocalSocket*>(sender());
   ui->plainTextEdit->appendPlainText(client->readAll());
}

好的,以下是一个使用QLocalServer和QLocalSocket实现进程间通信的简单示例: 假设我们有两个进程,一个是服务器进程,一个是客户端进程。我们需要在它们之间建立通信。 服务器进程代码: ```c++ #include <QtNetwork/QLocalServer> #include <QtNetwork/QLocalSocket> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QLocalServer server; if (!server.listen("my_local_server")) { qWarning() << "Unable to start the server: " << server.errorString(); return 1; } qDebug() << "Server started, waiting for clients to connect..."; QObject::connect(&server, &QLocalServer::newConnection, [&](){ QLocalSocket* socket = server.nextPendingConnection(); if (socket) { qDebug() << "New client connected"; socket->write("Hello from server!"); socket->flush(); socket->waitForBytesWritten(); socket->close(); socket->deleteLater(); } }); return a.exec(); } ``` 客户端进程代码: ```c++ #include <QtNetwork/QLocalSocket> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QLocalSocket socket; socket.connectToServer("my_local_server"); if (!socket.waitForConnected()) { qWarning() << "Unable to connect to the server: " << socket.errorString(); return 1; } qDebug() << "Connected to server, waiting for data..."; if (socket.waitForReadyRead()) { qDebug() << socket.readAll(); } socket.disconnectFromServer(); return a.exec(); } ``` 在服务器进程中,我们首先创建一个QLocalServer对象,然后调用其listen()方法来监听本地套接字。如果listen()返回false,则表示启动服务器失败。在服务器对象上注册newConnection信号的处理函数,当有客户端连接时,该函数会被调用。在函数内部,我们可以调用server.nextPendingConnection()获取新连接的QLocalSocket对象,然后向客户端发送一条消息,并关闭连接。 在客户端进程中,我们创建一个QLocalSocket对象,然后调用其connectToServer()方法来连接到服务器进程。如果连接失败,我们会输出错误消息。如果连接成功,我们会等待从服务器端发送的数据,并输出到控制台上。 以上就是一个简单的使用QLocalServer和QLocalSocket实现进程间通信的例子。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇龍_

若帮助到你,希望能给予鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值