qt+Tcp服务端+线程,支持多个客户端连接

头文件:

#ifndef MYTCPCLASS_H
#define MYTCPCLASS_H

#include <QObject>
#include <QTcpServer>
#include <QTcpSocket>
#include <QMessageBox>
#include <QTimer>
#define MAX_SOCKETBUF 10000
class MyTcpClass : public QObject
{
    Q_OBJECT
public:
    MyTcpClass();
    ~MyTcpClass();
    void initMyTcp();
    void SendData();
    void RecvData();
private:
    QTimer *myTimer;
    QTcpServer *myTcpSocket;
    QList<QTcpSocket*> TcpConnect;

    QHostAddress TargetAddress;
    quint16 TargetComPort;
signals:

public slots:
    void slot_CloseThread();
    void slot_StartThread();
    void slot_TimerOut();
    void slot_NewConnection();
    void slot_DisConnection();
};

#endif // MYTCPCLASS_H

实现:

#include "MyTcpClass.h"

MyTcpClass::MyTcpClass()
{
    TargetAddress = QHostAddress("");
    TargetComPort = 0;
}

MyTcpClass::~MyTcpClass()
{
    if(myTcpSocket != nullptr)
    {
        delete  myTcpSocket;
        myTcpSocket = nullptr;
    }
}

void MyTcpClass::initMyTcp()
{
    myTcpSocket = new QTcpServer();//服务器端监听套接字

    //监听任意地址尝试连接
    if(!myTcpSocket->listen(QHostAddress::Any,14521))
    {
        qDebug()<<"监听失败:"<<myTcpSocket->errorString();
        QMessageBox msg;
        msg.setText("Listen failed!");
        msg.setWindowFlags(Qt::WindowStaysOnTopHint);
        msg.exec();
        myTcpSocket->close();
        return;
    }
    else
    {
        qDebug()<<"监听成功";
        connect(myTcpSocket,&QTcpServer::newConnection,this,&MyTcpClass::slot_NewConnection);
    }
}

void MyTcpClass::slot_StartThread()
{
    initMyTcp();
    myTimer = new QTimer();
    connect(myTimer,&QTimer::timeout,this,&MyTcpClass::slot_TimerOut);
    myTimer->start(50);
}

void MyTcpClass::slot_TimerOut()
{
    RecvData();
    SendData();
}
void MyTcpClass::SendData()
{
    char data[1024] = "fhewfhefwafaefew";
    for(int i=0;i<TcpConnect.size();i++)
    {
        if(TcpConnect[i]->isWritable())
            TcpConnect[i]->write(data,sizeof(data));
    }
}

void MyTcpClass::RecvData()
{
    for(int i=0;i<TcpConnect.size();i++)
    {
        char RecDataBuf[MAX_SOCKETBUF];//unsigned
        while(!TcpConnect[i]->atEnd())
        {
           qint64 ctrecnum = TcpConnect[i]->read(RecDataBuf, MAX_SOCKETBUF);

           if(ctrecnum < 4)
                break;

           qDebug()<<"num= "<< TcpConnect[i]->peerAddress().toString()<<  " size= "<<ctrecnum;
            //进行处理的一些操作
            if(ctrecnum > 4)		//至少大于包头长度
            {
//                if(!pMyDataManage->MyBuff.isFull())
//                    pMyDataManage->MyBuff.write(RecDataBuf, ctrecnum);
            }
        }
     }
}
void MyTcpClass::slot_CloseThread()
{
    myTimer->stop();;
    delete myTimer;

    int i=0;
    foreach(QTcpSocket* soc, TcpConnect)
    {
        //qDebug()<<soc->peerAddress().toString()<<"  closed"<<endl;
        soc->deleteLater();
        TcpConnect.removeAt(i); //tcpSockets.removeOne(soc);
        i++;
    }

    myTcpSocket->close();
    if(myTcpSocket != nullptr)
    {
        delete myTcpSocket;
        myTcpSocket = nullptr;
    }
}
void MyTcpClass::slot_NewConnection()
{
    qDebug()<<"success  ";
    TcpConnect.append(myTcpSocket->nextPendingConnection());//返回已连接套接字对象
    TcpConnect[TcpConnect.size()-1]->setProperty("port",TcpConnect[TcpConnect.size()-1]->peerPort());
    connect(TcpConnect[TcpConnect.size()-1],&QTcpSocket::disconnected,this,&MyTcpClass::slot_DisConnection);
}

void MyTcpClass::slot_DisConnection()
{
    //qDebug()<<"delete  before= "<<TcpConnect.size();
    int i=0;
    foreach(QTcpSocket* soc, TcpConnect)
    {
        if(soc->state() == QTcpSocket::UnconnectedState)
        {
            //qDebug()<<soc->peerAddress().toString()<<"  closed"<<endl;
            soc->deleteLater();
            TcpConnect.removeAt(i); //tcpSockets.removeOne(soc);
        }
        i++;
    }
    //qDebug()<<"delete  late= "<<TcpConnect.size();
}
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Qt中,可以使用QTcpSocket和QTcpServer类来实现TCP连接多个客户端。下面是一种实现方法: 首先,创建一个QTcpServer对象来监听客户端连接: ```cpp QTcpServer server; server.listen(QHostAddress::Any, 1234); // 监听本地端口1234 ``` 然后,在有新客户端连接时,使用QTcpServer的newConnection信号槽将其连接到一个新的QTcpSocket对象: ```cpp connect(&server, &QTcpServer::newConnection, [=]() { QTcpSocket* socket = server.nextPendingConnection(); // 将socket添加到一个容器中,以便管理多个客户端连接 }); ``` 接下来,可以使用QTcpSocket对象与客户端进行通信。可以在readyRead信号槽中处理接收到的数据,以及在disconnected信号槽中处理客户端断开连接的情况: ```cpp connect(socket, &QTcpSocket::readyRead, [=]() { QByteArray data = socket->readAll(); // 处理接收到的数据 }); connect(socket, &QTcpSocket::disconnected, [=]() { // 处理客户端断开连接的情况 socket->deleteLater(); // 清理资源 }); ``` 需要注意的是,在进行通信的过程中,可以根据具体需求设置超时时间、发送和接收数据等各种细节的处理。 另外,为了管理多个客户端连接,可以将QTcpSocket对象添加到一个容器中,例如使用QList或QVector等容器类。 以上是大致的实现思路,具体的细节和错误处理可以根据项目需求进行调整。 ### 回答2: Qt是一款跨平台的开发框架,拥有丰富的网络编程功能。要实现TCP连接多个客户端,可以采用QtQTcpServer和QTcpSocket类。 首先,创建一个QTcpServer对象,并调用其listen()函数,指定服务端的监听地址和端口号。然后,在新的客户端连接到服务器时,QTcpServer会触发newConnection()信号。我们可以通过连接这个信号来处理新的客户端连接。 处理新连接的槽函数中,我们可以创建一个QTcpSocket对象,用于与客户端进行通信。通过调用QTcpServer的nextPendingConnection()函数,可以获取到与客户端连接QTcpSocket对象。可以为每个客户端连接创建一个新的QTcpSocket对象。 为了处理多个客户端连接,我们可以使用一个QList或QVector来存储所有的QTcpSocket对象。在处理新连接的槽函数中,将新的QTcpSocket对象添加到列表中。这样我们就可以通过遍历列表,对每个客户端进行操作。 当服务端从某个客户端接收到数据时,可以通过connected()信号与readyRead()信号来读取数据。当服务端要发送数据给客户端时,可以调用QTcpSocket的write()函数。 如果某个客户端断开连接QTcpSocket会触发disconnected()信号,我们可以在该信号的槽函数中将对应的QTcpSocket对象从列表中移除,并释放内存。 为了确保多个客户端可以同时进行连接和通信,可以使用多线程或者多线程框架(如QtConcurrent)来实现。每个客户端连接可以在一个单独的线程中进行处理。 总的来说,Qt提供了丰富的功能来处理TCP连接多个客户端。我们可以通过QTcpServer和QTcpSocket类来实现服务端多个客户端之间的通信,使用容器来存储多个客户端连接对象,并使用多线程来处理多个客户端的并发连接。 ### 回答3: 在Qt中实现TCP连接多个客户端,我们可以使用Qt的网络模块来处理。 首先,我们需要创建一个TcpServer对象来接受客户端连接请求和处理数据传输。 然后,我们可以使用QObject的connect方法将TcpServer的newConnection信号与自定义的槽方法连接起来。在槽方法中,我们可以获取到新连接的SocketDescriptor,并创建一个TcpSocket对象来处理与客户端的通信。 在TcpSocket对象中,我们可以使用QObject的connect方法将TcpSocket的readyRead信号连接到自定义的槽方法上。在槽方法中,我们可以获取到客户端发送的数据,并进行相应的处理。 此外,我们还可以使用QObject的connect方法将TcpSocket的disconnected信号连接到自定义的槽方法上,用于处理客户端断开连接的情况。 在main函数中,我们可以创建多个TcpSocket对象,并连接到同一个TcpServer对象上,从而实现多个客户端同时连接的功能。 最后,我们可以通过TcpSocket的write方法向客户端发送数据,也可以通过TcpSocket的close方法主动关闭与客户端连接。 通过以上步骤,我们就可以实现QtTCP连接多个客户端的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值