【qt】多线程

实现服务端多线程来处理多个客户端

使用之前写过的服务端的代码

此时我们不需要connect,和serverrecv,因为我们需要在自己实现的多线程里面处理不同客户端的请求

步骤

1.增加线程类

2.线程执行

3.实现run函数

run函数的作用就是处理不同的客户端,当不同客户端发来数据,服务端就会有信号,所以这个函数里面实现的就是之前写过的connect函数

4.实现serverrecv

这个函数的作用就是将客户端发送来的数据读取上来,但是这里无法读到文本框中,因为ui界面是widget控制的,所以我们只能把读到的消息打印在debug中

梳理

源码

qtthread.h

c 复制代码
#ifndef QTTHREAD_H
#define QTTHREAD_H

#include <QObject>
#include<QThread>
#include<QTcpSocket>
#include<QDebug>

class qtthread : public QObject
{
    Q_OBJECT
public:
    explicit qtthread(QTcpSocket*s,QObject *parent = nullptr);
    void run();
    void serverrecv();
signals:

private:
     QTcpSocket* s;

};

#endif // QTTHREAD_H

widget.h

c 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QTcpSocket>
#include<QTcpServer>
#include<qtthread.h>
//#include<QThread>
#define PORT 8080
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
private slots:
    void deal();
   // void serverrecv();


private:
    Ui::Widget *ui;
    QTcpServer *server;
};
#endif // WIDGET_H

qthread.cpp

c 复制代码
#include "qtthread.h"

qtthread::qtthread(QTcpSocket *socket, QObject *parent) : QObject(parent)
{
   s=socket;
}
void qtthread :: run()
{

     connect(s,&QTcpSocket::readyRead,this,&qtthread::serverrecv);

}
void qtthread ::serverrecv()
{

    qDebug()<<s->readAll();


}

widget.cpp

c 复制代码
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    server=new QTcpServer;
    server->listen(QHostAddress::AnyIPv4,PORT);
    connect(server,&QTcpServer::newConnection,this,&Widget::deal);
}

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

    QTcpSocket* socket=server->nextPendingConnection();
    ui->clientip->setText(socket->peerAddress().toString());
    ui->clientport->setText(QString::number(socket->peerPort()));

   // connect(socket,&QTcpSocket::readyRead,this,&Widget::serverrecv);

     qtthread *st=new qtthread(socket);
     st->run();

}
//void Widget::serverrecv()
//{

//    QTcpSocket* socket=(QTcpSocket*)sender();
//   // socket->readAll();//QBytearray
//    ui->recvinfo->setText(QString(socket->readAll()));

//}

演示

多线程

相关推荐
重生之我在20年代敲代码3 分钟前
strncpy函数的使用和模拟实现
c语言·开发语言·c++·经验分享·笔记
爱上语文5 分钟前
Springboot的三层架构
java·开发语言·spring boot·后端·spring
kejijianwen2 小时前
JdbcTemplate常用方法一览AG网页参数绑定与数据寻址实操
服务器·数据库·oracle
编程零零七2 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
2401_858286113 小时前
52.【C语言】 字符函数和字符串函数(strcat函数)
c语言·开发语言
铁松溜达py3 小时前
编译器/工具链环境:GCC vs LLVM/Clang,MSVCRT vs UCRT
开发语言·网络
everyStudy3 小时前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript
C-SDN花园GGbond5 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
高兴就好(石5 小时前
DB-GPT部署和试用
数据库·gpt
这孩子叫逆6 小时前
6. 什么是MySQL的事务?如何在Java中使用Connection接口管理事务?
数据库·mysql