Qt中基于QTcpServer和QTcpSocket的网络通信

在Qt中,基于Tcp套接字通信主要用到QTcpServer和QTcpSocket这两个类:

  • QTcpServer:用于服务端,用来监听客户端是否连接。
  • QTcpSocket:套接字类,客户端与服务端都需要使用,主要是用于操作数据。

一 .QTcpServer常用到的函数

       (1).bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)

        告诉服务端监听的地址和端口,如果地址是QHostAddress::Any,那么服务器将监听所有网路接口,如果端口为0,就会默认选择一个端口;

   如果返回为true则为真,否则为假。

       (2).void QTcpServer::newConnection()

         这是一个信号函数,每次有新的连接时,就会触发此信号。

       (3).QTcpSocket *QTcpServer::nextPendingConnection()

          将下一个挂起的连接作为已经连接的QTcpSocket套接字对象返回。

二 .QTcpSocket常用到的函数(QTcpSocket继承于QAbstractSocket)

         (1).void QAbstractSocket::connected()

          当客户端与服务端成功建立连接后,便会触发这个信号。

          (2).void QIODevice::readyRead()

           每当有新的数据被读取到,就会触发这个信号,比如说服务器向客户端发送数据时,客户端检测到有新数据来了,那边就会触发此信号,然后去处理数据。

          (3).void QAbstractSocket::disconnected()

            当客户端和服务端断开连接时,就出触发这个信号。

          (4).QByteArray QIODevice::readAll()  

           读取客户端或服务端发送过来的数据,并将其作为字节数组返回,如果返回一个空的QByteArray那么就意味着没有数据读取或者发生了错误。

          (5).qint64 QIODevice::write(const char *data)

           向客户端或者服务端发送数据,返回值是实际写入的字节数,如果发生了错误,那么返回值为-1;

三.服务端部分代码

复制代码
QTcpServerDemo::QTcpServerDemo(QWidget *parent)
    : QWidget(parent),m_pTcpServer(NULL),m_pTcpSocket(NULL)
{
    ui.setupUi(this);
    
    QString strTitle = (QString(u8"服务器 端口: %1")).arg(CONNECT_PORT);
    setWindowTitle(strTitle);

    //监听套接字
    m_pTcpServer = new QTcpServer(this); //指定父对象,让Qt自动回收内存控件
    m_pTcpServer->listen(QHostAddress::Any, CONNECT_PORT);

    connect(m_pTcpServer, &QTcpServer::newConnection,
        [=]()
        {
            QString strDisplay;
            //取出建立好链接的套接字
            m_pTcpSocket = m_pTcpServer->nextPendingConnection();
            if (NULL == m_pTcpSocket)
            {
                strDisplay = QString(u8"客户端连接失败%3").arg(getCurrentTime());
                ui.m_pTextRead->append(strDisplay);
                return;
            }
            //获取对方的IP和端口
            QString strIP = m_pTcpSocket->peerAddress().toString();
            quint16 nPort = m_pTcpSocket->peerPort();
            strDisplay = QString(u8"[%1:%2]:连接成功%3").arg(strIP).arg(nPort).arg(getCurrentTime());
            ui.m_pTextRead->append(strDisplay);
            
            connect(m_pTcpSocket, &QTcpSocket::readyRead,
                [=]()
                {
                    //从通信套接字中取出内容
                    QByteArray array = m_pTcpSocket->readAll();
                    QString str = QString("%1 %2").arg(QString(array)).arg(getCurrentTime());
                    ui.m_pTextRead->append(str);
                }
            );

            connect(m_pTcpSocket, &QTcpSocket::disconnected,
                [=]()
                {
                    QString str =QString(u8"服务端断开连接......%1").arg(getCurrentTime());
                    ui.m_pTextRead->append(str);
                }
            );
        }
        );

    
}
复制代码

四.客户端部分代码

复制代码
QTcpClientDemo::QTcpClientDemo(QWidget *parent)
    : QWidget(parent),m_pTcpSocket(NULL), m_bConnect(false)
{
    ui.setupUi(this);
    
    setWindowTitle(u8"客户端");

    //分配对象,指定父对象
    m_pTcpSocket = new QTcpSocket(this);
    if (m_pTcpSocket != NULL)
    {
        connect(m_pTcpSocket, &QTcpSocket::connected,
            [=]()
            {
                m_bConnect = true;
                QString str = QString(u8"成功和服务端建立连接......%1").arg(getCurrentTime());
                ui.m_TextRead->append(str);
            }
            );

        connect(m_pTcpSocket, &QTcpSocket::readyRead,
            [=]()
            {
                //获取对方发送的内容
                QByteArray array = m_pTcpSocket->readAll();
                QString str = QString("%1 %2").arg(QString(array)).arg(getCurrentTime());
                //添加到编辑区中
                ui.m_TextRead->append(str);
            }
        );

        connect(m_pTcpSocket, &QTcpSocket::disconnected,
            [=]()
            {
                m_bConnect = false;
                QString str = QString(u8"客户端断开连接......%1").arg(getCurrentTime());
                ui.m_TextRead->append(str);
            }
        );
    }  
}
复制代码

五.效果展示

 源代码地址:https://github.com/coczhang/QTcpDemo

posted @   TechNomad  阅读(1166)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示