qt关于tcp多线程服务器

该博客介绍了如何使用QT创建一个TCP多线程服务器,处理接收到的图像数据。TcpSocket类扩展了QTcpSocket,用于接收和处理来自客户端的数据,包括图像数据的接收、存储和处理,并通过并发机制进行数据处理。图像数据经过LensometerAlgorithm算法处理后,将结果回传给客户端。
摘要由CSDN通过智能技术生成

tcpserver.h

#ifndef TCPSERVER_H
#define TCPSERVER_H

#include <QTcpServer>
#include <QHash>
#include "tcpsocket.h"


//继承QTCPSERVER以实现多线程TCPscoket的服务器。
//如果socket的信息处理直接处理的话,很多新建的信号和槽是用不到的
class TcpServer : public QTcpServer
{
    Q_OBJECT
public:
    explicit TcpServer(QObject *parent = 0,int numConnections = 10000);
    ~TcpServer();

    void setMaxPendingConnections(int numConnections);//重写设置最大连接数函数
signals:
    void connectClient(const int , const QString & ,const quint16 );//发送新用户连接信息
    void readData(const int,const QString &, quint16, const QByteArray &);//发送获得用户发过来的数据
    void sockDisConnect(int ,QString ,quint16);//断开连接的用户信息
    void sentData(const QByteArray &,const int);//向scoket发送消息
    void sentDisConnect(int i); //断开特定连接,并释放资源,-1为断开所有。

public slots:
    void clear(); //断开所有连接,线程计数器请0
protected slots:
    void sockDisConnectSlot(int handle,const QString & ip, quint16 prot, QThread *th);//断开连接的用户信息

protected:
    void incomingConnection(qintptr socketDescriptor);//覆盖已获取多线程
private:
    QHash<int,TcpSocket *> * tcpClient;//管理连接的map
    int maxConnections;

};

#endif // TCPSERVER_H

tcpserver.cpp

#include "tcpserver.h"
#include "threadhandle.h"

TcpServer::TcpServer(QObject *parent,int numConnections) :
    QTcpServer(parent)
{
     tcpClient = new  QHash<int,TcpSocket *>;
     setMaxPendingConnections(numConnections);
}

TcpServer::~TcpServer()
{
    emit this->sentDisConnect(-1);
    delete tcpClient;
}

void TcpServer::setMaxPendingConnections(int numConnections)
{
    this->QTcpServer::setMaxPendingConnections(numConnections);//调用Qtcpsocket函数,设置最大连接数,主要是使maxPendingConnections()依然有效
    this->maxConnections 
Qt中实现TCP多线程服务器,通常我们会使用QThread和QTcpServer类来组织并发处理。以下是简要步骤: 1. **包含必要的库**: ```cpp #include <QObject> #include <QTcpServer> #include <QThread> ``` 2. **创建服务器类**: 创建一个继承自QObject的类,比如TcpServerThread,同时包含QTcpServer实例。 ```cpp class TcpServerThread : public QObject { Q_OBJECT QTcpServer *server; public: explicit TcpServerThread(QObject *parent = nullptr); ~TcpServerThread(); private slots: void startServer(); void newConnection(); signals: void connectionAccepted(int socketDescriptor); }; ``` 3. **初始化和启动服务器**: ```cpp TcpServerThread::TcpServerThread(QObject *parent) : QObject(parent) { server = new QTcpServer(this); connect(server, &QTcpServer::newConnection, this, &TcpServerThread::newConnection); if (!server->listen(QHostAddress::Any, 8000)) { // 端口8000作为示例 qCritical() << "Could not start server: " << server->errorString(); } else { emit connectionAccepted(server->nextPendingConnection()); } } void TcpServerThread::startServer() { moveToThread(&thread); // 将服务器移到新线程中 thread.start(); // 启动线程 } ``` 4. **处理新连接**: ```cpp void TcpServerThread::newConnection() { QAbstractSocket *socket = server->nextPendingConnection(); if (socket) { // 在这里处理新的客户端连接,如创建一个新线程或QObject来处理每个连接 QThread *clientThread = new QThread; TcpClientHandler *handler = new TcpClientHandler(socket, clientThread); handler->moveToThread(clientThread); connect(handler, &TcpClientHandler::disconnection, clientThread, &QThread::quit); connect(clientThread, &QThread::finished, handler, deleteLater); connect(clientThread, &QThread::finished, clientThread, deleteLater); clientThread->start(); } } ``` 5. **处理客户端通信**: `TcpClientHandler` 类用于处理客户端的请求和响应,这通常是异步操作,例如读取数据、发送响应等。 6. **线程管理**: - 使用QThread对每个客户端连接进行封装,以便在单独的线程中运行,避免阻塞主线程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

vqt5_qt6

你的鼓励是我们创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值