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

这篇具有很好参考价值的文章主要介绍了在QT中使用多线程并发服务器(C++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

在QT中使用多线程并发服务器(C++),QT开发,服务器,qt,c++,tcp

重写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 。文章来源地址https://www.toymoban.com/news/detail-848204.html

到了这里,关于在QT中使用多线程并发服务器(C++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 多线程并发服务器(TCP)

    服务器       客户端     结果    

    2024年02月12日
    浏览(43)
  • 基于多线程实现服务器并发

    看大丙老师的B站视频总结的笔记 19-基于多线程实现服务器并发分析_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1F64y1U7A2/?p=19spm_id_from=pageDrivervd_source=a934d7fc6f47698a29dac90a922ba5a3 思路:首先accept是有一个线程的,另外只要这个accept成功的和一个客户端建立了连接,那么我们就需要创

    2024年02月14日
    浏览(37)
  • 【Linux网络编程】高并发服务器框架 线程池介绍+线程池封装

    前言 一、线程池介绍 💻线程池基本概念 💻线程池组成部分 💻线程池工作原理  二、线程池代码封装 🌈main.cpp 🌈ThreadPool.h 🌈ThreadPool.cpp 🌈ChildTask.h  🌈ChildTask.cpp 🌈BaseTask.h 🌈BaseTask.cpp 三、测试效果 四、总结 📌创建线程池的好处 本文主要学习 Linux内核编程 ,结合

    2024年01月16日
    浏览(95)
  • 【高并发服务器 02】——线程池与IO多路复用

    线程池的好处 :所有的池都是为了事先把资源准备好,在后续用的时候可以更加方便的拿到这个资源—— 不用去申请、释放资源 什么时候用线程池 ? IO事务并发较高 :人在杭州,但是数据库在北京,想要查询数据库,需要通过互联网建立TCP三次握手,频繁地创建和销毁线

    2024年03月23日
    浏览(51)
  • Linux网络编程:多进程 多线程_并发服务器

    文章目录: 一:wrap常用函数封装 wrap.h  wrap.c server.c封装实现 client.c封装实现 二:多进程process并发服务器 server.c服务器 实现思路 代码逻辑  client.c客户端 三:多线程thread并发服务器 server.c服务器 实现思路 代码逻辑  client.c客户端 ​​​​   read 函数的返回值 wrap.h  wrap

    2024年02月12日
    浏览(56)
  • 分别通过select、多进程、多线程实现一个并发服务器

    多进程 多线程 select

    2024年02月20日
    浏览(38)
  • C/S架构学习之多线程实现TCP并发服务器

    并发概念: 并发是指两个或多个事件在 同一时间间隔 发生; 多线程实现TCP并发服务器的实现流程: 一、创建套接字(socket函数): 通信域选择IPV4网络协议、套接字类型选择流式; 二、填充服务器的网络信息结构体: 1.定义网络信息结构体变量; 2.求出结构体变量的内存

    2024年02月06日
    浏览(61)
  • 计算机网络编程 | 并发服务器代码实现(多进程/多线程)

    欢迎关注博主 Mindtechnist 或加入【Linux C/C++/Python社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。 专栏:《网络编程》 当涉及到构建高性能的服务

    2024年02月08日
    浏览(81)
  • Linux网络编程:线程池并发服务器 _UDP客户端和服务器_本地和网络套接字

    文章目录: 一:线程池模块分析 threadpool.c 二:UDP通信 1.TCP通信和UDP通信各自的优缺点 2.UDP实现的C/S模型 server.c client.c 三:套接字  1.本地套接字 2.本地套 和 网络套对比 server.c client.c threadpool.c   server.c client.c server.c client.c

    2024年02月11日
    浏览(66)
  • Linux中 socket编程中多进程/多线程TCP并发服务器模型

    一次只能处理一个客户端的请求,等这个客户端退出后,才能处理下一个客户端。 缺点:循环服务器所处理的客户端不能有耗时操作。 模型 源码 可以同时处理多个客户端请求 父进程 / 主线程专门用于负责连接,创建子进程 / 分支线程用来与客户端交互。 模型 源码 模型 源

    2024年02月12日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包