在QT中使用多线程并发服务器(C++)

news2024/9/22 8:30:17

什么是多线程并发服务器?在QT里如何使用多线程并发服务器呢?

多线程并发服务器是一种网络服务器设计,它能够同时处理多个客户端的请求。在多线程服务器中,主线程负责监听和接受来自客户端的连接请求,每当有一个新的连接请求到来时,服务器就会创建一个新的线程来处理该连接。这样,每个客户端都有一个专门的线程来为之服务,从而实现并发处理多个客户端请求的目的。

下面是如何在QT里使用多线程并发服务器的流程。

可以先看这个图理解一下。

重写incomingConnection()函数

首先在myserver.h里创建一个Myserver类继承QTcpServer,重写 incomingConnection();

并创建一个自定义信号。

  myserver.h

#ifndef MYSERVER_H
#define MYSERVER_H
#include<QTcpServer>

class Myserver:public QTcpServer
{
    Q_OBJECT
public:
    Myserver(QObject *parent = 0);
    //重写,传递套接字描述(sd标志)
    void incomingConnection(qintptr socketDescriptor);
    ~Myserver();
signals:   //信号函数不需要实现
    void sig_sendsd(qintptr sd);
};

#endif // MYSERVER_H

 在myserver.c里实现重写的incomingConnection()函数,当有客户端连接的时,会发送包含socket套接字描述符的信号sig_sendsd(socketDescriptor)(上面创建的信号)到主线程。(套接字描述符socketDescriptor很重要,在子线程里用来创建socket对象跟客户端进行通信)。

#include "myserver.h"

Myserver::Myserver(QObject *parent):QTcpServer(parent)
{

}
void Myserver::incomingConnection(qintptr socketDescriptor)
{
    //发送自定义信号给主线程(sd标志)
    emit sig_sendsd(socketDescriptor);
}
Myserver::~Myserver()
{
}

创建子线程类

在socketthread.h里创建一个叫socketthread的子线程类用于处理每个客户端发来的信息。

#ifndef SOCKETTHREAD_H
#define SOCKETTHREAD_H
#include<QThread>
#include<QTcpSocket>



class SocketThread:public QThread
{
    Q_OBJECT

public:
    SocketThread(qintptr sd);
    void run();  //重写run函数,执行线程

   
    ~SocketThread();
private slots:
    void slot_read();
    void slot_disconnect();


private:
    qintptr sd;
    QTcpSocket *socket;
   
};

#endif // SOCKETTHREAD_H

 在socketthread.c中run()函数中处理客户端发来的信息,以及发送信息到客户端。

#include "socketthread.h"

SocketThread::SocketThread(qintptr sd):sd(sd)
{
   
}

void SocketThread::run()
{
    socket=new QTcpSocket;
    socket->setSocketDescriptor(sd);

    connect(socket,SIGNAL(readyRead()),this,SLOT(slot_read()));
    connect(socket,SIGNAL(disconnected()),this,SLOT(slot_disconnect()));  
}

void SocketThread::slot_read()
{
    isRead=true;
    qDebug()<<"客服端来消息了";
}
void SocketThread::slot_disconnect()
{
    qDebug()<<"客户端已断开";
    isRun=false;
}
SocketThread::~SocketThread()
{
    qDebug()<<"子线程结束";
}

 主线程(重点)

在主线程里创建myserver类对象,监听客户端,等待客户端连接。当有客户端连接时,myserver类对象会发出自定义信号sig_sendsd(qintptr),通过connect()函数,执行槽函数slot_recv_sd()。在槽函数里创建子线程类对象,在子线程类对象里创建socket套接字(上图),跟客户端通信。

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initIp();
    server=new Myserver(this);
    server->listen(QHostAddress::Any,12345); //any所有地址  12345port
    //当有新的客户端连接,server对象会发出自定义信号
    connect(server,SIGNAL(sig_sendsd(qintptr)),this,SLOT(slot_recv_sd(qintptr)));
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::initIp()   //获取本地ip地址
{
    QString ip;
    QString hostName = QHostInfo::localHostName();
    QHostInfo info = QHostInfo::fromName(hostName);
    QList<QHostAddress> list=info.addresses();
    for(int i=0;i<list.size();i++)
    {
        //获取协议类型
        if(list[i].protocol()==QAbstractSocket::IPv4Protocol)
        {
            ip+="*";
            ip+=list[i].toString();
        }
    }
    ui->label_ip->setText(ip);
}
void MainWindow::slot_recv_sd(qintptr sd)
{
    //创建子线程
    st=new SocketThread(sd);
    st->start();
    
}

最后的最后,感谢大家的支持,请求各路英雄豪杰多多打赏,多多关注,多多点赞,我是只发布高质量文章的 better-code 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1947957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DNS服务器的搭建

1、DNS服务器端软件 DNS 的域名解析都是 udp/53 . 主从之间的数据传输默认使 ⽤tcp/53 DNS服务器端软件&#xff1a; Bind是⼀款开放源码的DNS服务器软件&#xff0c;Bind由美国加州⼤学Berkeley&#xff08;伯克 利&#xff09;分校开发和维护的&#xff0c;全名为Berkele…

美容院如何提高门店销售业绩?博弈美业收银系统分享五大策略

美容院要如何增加门店业绩&#xff1f;各位老板可以考虑以下几个方面的策略&#xff1a; 一、品牌宣传和营销&#xff1a; • 制定全面的营销计划&#xff0c;包括线上和线下宣传。可以利用社交媒体、网站、本地广告等多种渠道提升品牌知名度。 • 开展促销活动吸引新客户&a…

PYTHON学习笔记(七、python数据结构--集合)

目录 &#xff08;4&#xff09;set集合 1、集合的创建方式 1&#xff09;使用{ }直接创建集合 2&#xff09;使用内置函数set( )创建集合 3&#xff09;使用“ 集合生成式 ”生成集合 2、集合的访问方式 1&#xff09;使用for循环遍历 3、集合的修改操作 4、集合的…

SvelteKit - 1. 初始化项目

官方 doc - create a project 1、基本环境 &#xff08;下面是我这里的环境&#xff0c;亲测用 node 14 和 16 install 会报错&#xff09; node&#xff1a;20.9.0 npm&#xff1a;10.1.0 2、初始化项目 npm create sveltelatest my-app cd my-app npm install npm run de…

本地部署、微调大模型

本地部署、微调大模型 一、本地部署大模型 1.部署 更新git-lfs apt-get updateapt-get install git-lfs2. 这里极容易出错&#xff0c;如果报错就初始化git git lfs install git init git lfs install3.下载ChatGLM-6B源代码 git clone https://github.com/THUDM/ChatGLM…

华为强制恢复出厂设置后如何恢复数据?数据重生的2个方法介绍

华为作为全球知名的手机品牌&#xff0c;其产品在市场上广受欢迎。然而&#xff0c;有时由于各种原因&#xff0c;我们可能需要强制恢复出厂设置&#xff0c;这往往意味着数据的丢失。那么&#xff0c;如何在华为强制恢复出厂设置后&#xff0c;让数据“重生”呢&#xff1f;本…

赋能安防摄像头云台:国产大功率机壳开关旭之源电源可靠、高效的优势

由GIS地图、图像采集、传输、控制、显示等设备和控制软件组成的“天网系统”通过对固定区域进行实时监控和信息记录&#xff0c;为社会治安和城市管理提供了强有力的支撑。 随着技术的不断革新和升级&#xff0c;天网技术逐渐拓展到全国范围&#xff0c;并在各个城市和乡村实现…

兼容浏览器,切换PC端显示PC端,切换H5端显示H5端

兼容浏览器&#xff0c;切换PC端显示PC端&#xff0c;切换H5端显示H5端 Uniapp vue3 Uview 项目 Vue3 Vite Ts ElementPlus PC端 &#xff08;在浏览器PC端&#xff0c;切换H5端兼容显示H5端页面&#xff09; 浏览器H5端 (在浏览器H5端&#xff0c;切换PC端兼容显示PC端…

【React】通过实际示例详解评论列表渲染和删除

文章目录 一、引言二、初始状态与状态更新1. 使用useState钩子管理状态2. 评论列表的初始数据 三、列表渲染的实现1. list.map(item > { ... })2. return 语句3. JSX 语法4. 为什么这样设计5. 完整解读 四、列表项的唯一标识1. key 的作用2. key 的用法3. 可以没有 key 吗&a…

SpringBoot整合Kaptcha实现图片验证码加减乘除

目录 SpringBoot整合Kaptcha实现图片验证码加减乘除1. 添加Kaptcha依赖2. 自定义文本生成器3. 配置Kaptcha4. 获取验证码图片的方法4.1. 详细讲解控制器中的切割操作 5. 总结 SpringBoot整合Kaptcha实现图片验证码加减乘除 在开发Web应用时&#xff0c;验证码是一个常见的功能…

Dhtmlx Gantt教程:创建交互式甘特图的完整指南

在现代的项目管理中&#xff0c;时间是一种宝贵的资源&#xff0c;而甘特图则是一把解锁项目进度的魔法钥匙&#xff0c;想象一下&#xff0c;您可以在一个直观而动态的时间轴上&#xff0c;清晰地看到项目的每一个任务如何交织在一起&#xff0c;如何随着时间的推移展开&#…

temu卖家中心入口登入在哪里,跨境电商temu卖家中心入口登入

在跨境电商的浪潮中&#xff0c;拼多多推出的Temu平台以其独特的商业模式和优惠政策&#xff0c;吸引了众多卖家的目光。对于想要入驻Temu平台的商家而言&#xff0c;找到正确的卖家中心入口并成功登录&#xff0c;是开启跨境电商之旅的第一步。那么&#xff0c;Temu卖家中心入…

QGC二次开发入门教程(一):课程大纲

文章目录 前言一、课程大纲二、修改软件名称三、修改软件图标四、官方QGC中文版BUG修复五、汉化六、修改商标七、添加信号-槽1、添加文件到QGC工程2、添加界面3、QML和C交互4、信号与槽5、测试 八、添加QML和C交互九、MAVLINK的解析与发送十、换地图十一、添加自定义mavlink消息…

3. 手势识别(LeNet、Vgg16、ResNet50)

手势识别 Show me your code1. 模型 model.py2. LeNet 实现手势识别&#xff08;详细&#xff09;2.1 数据打包2.2 搭建模型2.3 训练模型2.4 结果分析2.5 推理过程 3. Vgg16 手势识别4. ResNet50 手势识别 Show me your code 1. 模型 model.py import torch from torch impor…

基于单片机的智能台灯设计

摘 要 &#xff1a; 随着电子产品智能化的发展 &#xff0c; 生活中人们使用的照明工具也逐渐智能化 &#xff0c; 功能也越来越丰富 。 本文介绍了使用单片机进行可调光台灯系统的设计。 通过控制单片机输出高低电平的持续时间 &#xff0c; 从而改变 PWM 的占空比 &#…

el-tree树添加向下移动按钮,前端界面调整顺序

需求&#xff1a;树上添加向下按钮&#xff0c;再不调用接口的情况下&#xff0c;调整树的顺序结构 遇到的问题&#xff1a;第一次点击更新的&#xff0c;数据和视图是调整好的&#xff0c;再次点击页面调整顺序&#xff0c;只有数据被调整了&#xff0c;视图没有发生改变。 &…

【音视频之SDL2】bmp图片与绘制bmp

文章目录 前言BMP是什么SDL2绘制BMP的原理SDL2绘制BMP的流程SDL_LoadBMP作用函数原型参数返回值示例代码 SDL_BlitSurface作用函数原型参数返回值 示例代码效果展示总结 前言 在现代多媒体应用中&#xff0c;图像的处理和显示是非常重要的一部分。无论是在游戏开发还是在视频处…

Qt SQLite数据库编程学习总结

到此为止&#xff0c;就使用Qt进行SQLite数据库的操作&#xff0c;做一次总结 1. Qt中数据库操作的相关概念和类 Qt 数据库编程相关基本概念https://blog.csdn.net/castlooo/article/details/140497177 2.表的只读查询--QSqlQueryModel QSqlQueryModel单表查询的使用总结htt…

Nuxt.js 环境变量配置与使用

title: Nuxt.js 环境变量配置与使用 date: 2024/7/25 updated: 2024/7/25 author: cmdragon excerpt: 摘要&#xff1a;“该文探讨了Nuxt.js框架下环境变量配置的详细过程&#xff0c;涉及.env文件配置、运行时访问、安全性考量、在不同场景下的实践&#xff08;如Vue应用、…

华为OD机试 - 分配土地 (Java 2024年C卷D卷)

华为OD机试&#xff08;C卷D卷&#xff09;2024真题目录(Java & c & python) 题目描述 从前有个村庄&#xff0c;村民们喜欢在各种田地上插上小旗子&#xff0c;旗子上标识了各种不同的数字。 某天集体村民决定将覆盖相同数字的最小矩阵形的土地分配给村里做出巨大贡…