QTcpServer多客户端连接

在Qt中,当QTcpServer接收到新的客户端连接时,会触发newConnection信号。为了解决多个客户端连接时数据来源辨识问题,可以重写QTcpServer的incomingConnection()函数,创建自定义QTcpSocket子类,使用handle作为标识符。这样,服务器在接收到数据时能准确识别数据来源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qt默认的QTcpServer有新的连接时会触发newConnection信号,在其对应的槽函数中new QTcpSocket,
通过new的QTcpSocket对象接受发送数据,当有多客户端连接时,Server端接受的数据将不容易分辨是哪个客户端的socket发送的数据,解决这个问题的办法是重写QTcpServer中的incomingConnection(qintptr handle)函数,当有新的连接时,会调用该函数,在该函数中new 一个Socket的,并将函数中的参数handle传递给new的socket作为该socket的ID,这样当有数据发送到server端的时候,就可以知道是哪个客户端的socket。这里需要派生一个QTcpSocketlei用于接收handle作为socket的ID。具体代码实现如下:

派生QTcpSocket:

#ifndef TCPSOCKET_H
#define TCPSOCKET_H

#include <QObject>
#include <QTcpSocket>

class TcpSocket : public QTcpSocket
{
   
    Q_OBJECT
public:
    TcpSocket(const int handle);

    void slot_readData();
signals:
    void sig_disconnect(int);
    void sig_readyRead(int, const QByteArray&);

private slots:
    void slot_disconnect();

private:
    int m_handle;

};

#endif // TCPSOCKET_H

#include "TcpSocket.h"

TcpSocket::TcpSocket(const int handle) : m_handle(handle)
{
   
    this->setSocketDescriptor(m_handle);
    connect(this,&TcpSocket::disconnected,this,&TcpSocket::slot_disconnect);
    connect(this,&TcpSocket::readyRead,this,&TcpSocket::slot_readData); 
}

void TcpSocket::slot_disconnect()
{
   
    emit sig_disconnect(m_handle);
}

void TcpSocket::slot_readData()
{
   
    QByteArray data = readAll();
    emit sig_readyRead(m_handle, data);
}

派生QTcpServer,重写incomingConnection(qintptr handle)函数

#ifndef TCPSERVER_H
#define TCPSERVER_H

#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值