QTcpServer简单的TCP服务器连接

1、简介

简单实现控制TCP服务器获取连接的套接字。点击断开服务器即可关闭所有连接,最大连接数量为5个。

声明源文件

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    //设置固定大小
    setFixedSize(1024,600);

    btnClearText = new QPushButton(this);
    btnCtrlServer = new QPushButton(this);
    textRecvBrowser = new QTextBrowser(this);

    //按键清空
    btnClearText->setGeometry(48,40,200,60);
    btnClearText->setText("清空浏览");

    //设置控制按钮
    btnCtrlServer->setGeometry(48, 40+40+30 , 200, 60);
    btnCtrlServer->setText("打开服务");

    //浏览处理
    textRecvBrowser->setGeometry(300, 40, 649, 500);

    //连接处理
    QObject::connect(btnClearText, SIGNAL(clicked()), this, SLOT(on_pushButton_textRecvBrowser()));
    QObject::connect(btnCtrlServer, SIGNAL(clicked()),this, SLOT(on_pushButton_ctrlTcpServer()));

    //TCP服务器处理
    tcpServer = new QTcpServer(this);
    QObject::connect(tcpServer, SIGNAL(newConnection()),this, SLOT(on_tcpServer_newConnectCallHandler()));

    //最大连接数量5个
    tcpServer->setMaxPendingConnections(5);
    tcpServer->listen(QHostAddress("127.0.0.1"), 80);
    if(tcpServer->isListening())
        btnCtrlServer->setText("关闭服务");
    else
        btnCtrlServer->setText("打开服务");

}

MainWindow::~MainWindow()
{
    delete btnClearText;
    delete btnCtrlServer;
    delete textRecvBrowser;
    delete tcpServer;
}

//清空浏览记录
void MainWindow::on_pushButton_textRecvBrowser()
{
    textRecvBrowser->clear();
}

//
void MainWindow::on_pushButton_ctrlTcpServer()
{
    //状态查询
    if(tcpServer->isListening())
    {
        //遍历所有数据
        foreach(QTcpSocket* tcpSocket, tcpSocketList)
        {
            if(tcpSocket->state() == QAbstractSocket::ConnectedState)
                tcpSocket->close();//关闭连接
        }

        //
        tcpServer->close();
    }
    else
        tcpServer->listen(QHostAddress::Any, 80);

    //监听状态
    if(tcpServer->isListening())
        btnCtrlServer->setText("关闭服务");
    else
        btnCtrlServer->setText("打开服务");
}

//IPv6转换IPv4
QString convert_to_ipv4_addr(QHostAddress &addr)
{
    quint32  addr_origin = addr.toIPv4Address();
    QHostAddress addr_host = QHostAddress(addr_origin);
    QString  addr_str = addr_host.toString();
    return addr_str;
}

//新建连接
void MainWindow::on_tcpServer_newConnectCallHandler()
{
    while (tcpServer->hasPendingConnections()) {

        //获取连接
        QTcpSocket *tcpSocket = tcpServer->nextPendingConnection();

        //添加指针列表
        tcpSocketList.append(tcpSocket);

        //显示具体连接信息
        QHostAddress ipv6 = tcpSocket->peerAddress();
        textRecvBrowser->append(convert_to_ipv4_addr(ipv6) + ":" + QString::number(tcpSocket->peerPort()));

        //设置连接
        QObject::connect(tcpSocket, SIGNAL(readyRead()),this, SLOT(on_tcpSocket_readyRead()));
        QObject::connect(tcpSocket, SIGNAL(disconnected()), this, SLOT(on_tcpSocket_disconnected()));

        //
        qDebug() << "当前连接数量" << tcpSocketList.size();
    }

}

void MainWindow::on_tcpSocket_disconnected()
{
    QTcpSocket* socket = qobject_cast<QTcpSocket *>(sender()); //当前信息

    //断开所有连接
    if(socket->state() == QAbstractSocket::ConnectedState)
        socket->close();//关闭连接

    //断开连接则清除
    tcpSocketList.removeOne(socket);

    textRecvBrowser->append("已断开连接");

    qDebug() << "当前连接数量" << tcpSocketList.size();
}

//
void MainWindow::on_tcpSocket_readyRead()
{
    QTcpSocket* socket = qobject_cast<QTcpSocket *>(sender());  // 取得当前socket对象

    socket->write("Hello",5);
//    QMessageBox msgBox(this);

//    msgBox.setText("我是准备好读数据");
//    msgBox.setWindowTitle("提示");
//    msgBox.exec();
}

声明的头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QTextBrowser>
#include <QTcpServer>
#include <QTcpSocket>
#include <QHostAddress>
#include <QMessageBox>
#include <QDebug>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_textRecvBrowser();
    void on_pushButton_ctrlTcpServer();
    void on_tcpServer_newConnectCallHandler();


    void on_tcpSocket_readyRead();
    void on_tcpSocket_disconnected();
private:
    QList<QTcpSocket *>  tcpSocketList;

    QPushButton   *btnCtrlServer = nullptr;
    QPushButton   *btnClearText = nullptr;
    QTextBrowser  *textRecvBrowser = nullptr;
    QTcpServer    *tcpServer = nullptr;
};
#endif // MAINWINDOW_H
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现一个Qt TCP服务器连接多个客户端,可以使用Qt Network模块中的QTcpServerQTcpSocket类。 首先要创建一个QTcpServer对象,并在其中的某个函数(如`incomingConnection()`)中监听新的客户端连接请求。当有新的客户端连接请求时,可以通过调用`nextPendingConnection()`函数来获得一个QTcpSocket对象,表示与该客户端的连接。 接下来,可以将该QTcpSocket对象添加到一个存储所有客户端连接的容器中(如QList<QTcpSocket*>),并对其进行读写操作。可以使用`readyRead()`信号来接收客户端发送的数据,使用`write()`函数来向客户端发送数据。 当客户端连接断开时,可以使用`disconnected()`信号来处理该事件,并从存储所有客户端连接的容器中将该QTcpSocket对象移除。 以下是一个简单的示例代码: ```cpp #include <QTcpServer> #include <QTcpSocket> #include <QList> class MyServer : public QTcpServer { Q_OBJECT public: MyServer(QObject *parent = nullptr) : QTcpServer(parent) {} protected: void incomingConnection(qintptr socketDescriptor) override { QTcpSocket *clientSocket = new QTcpSocket(this); if (!clientSocket->setSocketDescriptor(socketDescriptor)) { delete clientSocket; return; } m_clients.append(clientSocket); connect(clientSocket, &QTcpSocket::readyRead, this, &MyServer::readData); connect(clientSocket, &QTcpSocket::disconnected, this, &MyServer::disconnected); } private slots: void readData() { QTcpSocket *clientSocket = static_cast<QTcpSocket*>(sender()); if (!clientSocket) { return; } QByteArray data = clientSocket->readAll(); // 处理接收到的数据 // 回复客户端 clientSocket->write("Hello, client!"); } void disconnected() { QTcpSocket *clientSocket = static_cast<QTcpSocket*>(sender()); if (!clientSocket) { return; } m_clients.removeOne(clientSocket); clientSocket->deleteLater(); } private: QList<QTcpSocket*> m_clients; }; ``` 在上面的代码中,`MyServer`继承自`QTcpServer`,并重写了`incomingConnection()`函数处理新的客户端连接请求。在该函数中,创建一个新的QTcpSocket对象表示与该客户端的连接,并将其添加到存储所有客户端连接的容器中。 在`readData()`函数中,处理接收到的数据并向客户端回复数据。在`disconnected()`函数中,处理客户端断开连接的事件并将其从存储所有客户端连接的容器中移除。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值