QTcpServer多客户端连接

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

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

#
Qt是一种流行的跨平台应用程序开发框架,其中包含了一些用于网络通信的类。其中之一就是QtQTcpServer类,它提供了一种简单的方式来创建一个TCP服务器。 使用QTcpServer类,我们可以方便地实现多个客户端连接到服务器的功能。首先,我们需要创建一个QTcpServer对象,并调用其listen()函数来监听指定的IP地址和端口。当有客户端连接到服务器时,QTcpServer会自动触发一个新的连接信号newConnection(),我们可以使用一个槽函数来处理这个信号。 在槽函数中,我们可以调用QTcpServer的nextPendingConnection()函数来获取新的连接,然后将其保存到一个QList或QVector中,以便于对它们进行管理。每个连接都代表一个与客户端的通信通道,我们可以通过调用QTcpSocket的相应函数来读取和写入数据。 为了处理多个客户端连接,我们可以使用Qt的事件循环机制。在每次循环中,我们可以遍历保存连接的列表,检查是否有新的数据可读取。我们可以使用QIODevice的readyRead()信号来实现这一功能,当有数据可读取时,我们可以调用QTcpSocket的相应函数来读取数据。 另外,我们还可以设置QTcpServer的maxPendingConnections属性来限制同时连接到服务器的客户端数量。当达到最大连接数时,后续的连接请求会被服务器忽略。 总的来说,使用QTcpServer实现多个客户端连接的功能相对简单,我们只需要注意管理连接对象和使用事件循环机制来处理数据即可。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值