Qt中跨进程Socket通信以及socket跨线程通信

一 QTcpServer 创建流程

  1. 创建套接字服务器 QTcpServer 对象,
  2. 通过 QTcpServer 对象设置监听,即:QTcpServer::listen()
  3. 基于 QTcpServer::newConnection() 信号检测是否有新的客户端连接
  4. 如果有新的客户端连接调用*QTcpServer::nextPendingConnection() 得到通信的QTcpSocket对象 使用通信的套接字对象 QTcpSocket 和客户端进行通信,readyRead信号
 //1.创建server对象
    auto server=new QTcpServer(this);
    //2.设置服务器监听listen(ipAddr,port)
    auto res=server->listen(QHostAddress::Any,8888);//返回监听成功与否,可能存在端口占用情况
    //3.基于 QTcpServer::newConnection() 信号检测是否有新的客户端连接
    connect(server,&QTcpServer::newConnection,[=]()
    {
        QTcpSocket* tcpSocket=server->nextPendingConnection();//接收新的客户端连接,用于实际的收发处理

        //4.收发处理,
        //4.1 当收到数据请求时,tcpSocket会发射readyread信号
        connect(tcpSocket,&QTcpSocket::readyRead,[=]()
        {
            //收到信息请求
            auto sMsg=tcpSocket->readAll();
            qDebug()<<"Datas from the remote client:"<<sMsg;
        });
        //4.2 写数据
        QByteArray sWriteMsg="Hello Client";
        tcpSocket->write(sWriteMsg);
    });

本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓ 

二 QTcpSocketClient创建流程

  1. 创建套接字服务器 QTcpSocket对象,
  2. 连接服务器,绑定服务器端绑定的IP和端口信息, QAbstractSocket::connectToHost(QHostAddress("127.0.0.1"),8888)
  3. 检测是否与服务器连接成功,co
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt线程通信需要使用信号和槽机制。对于UDP socket线程通信,可以按照以下步骤进行操作: 1. 创建一个继承自QObject的自定义类,用于处理UDP socket的相关操作。 ```cpp class UDPSocketHandler : public QObject { Q_OBJECT public: explicit UDPSocketHandler(QObject *parent = nullptr); // 其他成员函数和变量 signals: void dataReceived(QByteArray data); public slots: void sendData(QByteArray data); // 其他槽函数 }; ``` 2. 在UDPSocketHandler类创建一个QUdpSocket对象,并在构造函数进行初始化和绑定。 ```cpp UDPSocketHandler::UDPSocketHandler(QObject *parent) : QObject(parent) { // 创建并绑定socket QUdpSocket *socket = new QUdpSocket(this); socket->bind(QHostAddress::Any, 1234); // 绑定到本地IP和端口1234 // 将socket的readyRead信号与槽函数进行连接 connect(socket, &QUdpSocket::readyRead, this, [socket]() { QByteArray data; while (socket->hasPendingDatagrams()) { data.resize(socket->pendingDatagramSize()); socket->readDatagram(data.data(), data.size()); emit dataReceived(data); } }); } ``` 3. 在主线程创建一个UDPSocketHandler对象,并通过信号和槽进行线程通信。 ```cpp int main(int argc, char *argv[]) { QApplication a(argc, argv); // 创建UDPSocketHandler对象 UDPSocketHandler udpHandler; // 创建UI窗口等代码... // 将UI的信号与udpHandler的槽函数进行连接 QObject::connect(&ui, &UIWidget::sendData, &udpHandler, &UDPSocketHandler::sendData); return a.exec(); } ``` 4. 在UI部分,通过信号槽机制将数据发送到UDPSocketHandler对象,实现线程通信。 ```cpp class UIWidget : public QWidget { Q_OBJECT public: explicit UIWidget(QWidget *parent = nullptr); signals: void sendData(QByteArray data); private slots: void onSendButtonClicked() { QByteArray data = "Hello UDP!"; emit sendData(data); } }; ``` 通过以上步骤,可以实现在UI线程发送数据到UDP socket所在的线程,并在该线程接收数据。记得在.pro文件添加`QT += network`来引入网络模块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值