资源简介

Qt使用tcp实现的简单服务端和客户端(带心跳检测)。。很基础的实现,大概适合对Qt tcpsever 不太清楚的人看。。

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include “chatsocket.h“
#include “mymessagedef.h“

ChatSocket::ChatSocket(qintptr socketDescriptor Qobject *parent)
    :   QTcpSocket(parent)
{
    if (!setSocketDescriptor(socketDescriptor))
    {
        emit consoleMessage(errorString());
        deleteLater();
    }

    m_heartbeat = new QTimer(this);
    m_heartbeat->setInterval(30000);
    m_lastTime = QDateTime::currentDateTime();

    connect(this &ChatSocket::readyRead this &ChatSocket::heartbeat);
    connect(this &ChatSocket::readyRead this &ChatSocket::readClientData);
    connect(this &ChatSocket::disconnected this &ChatSocket::onDisconnected);
    connect(m_heartbeat &QTimer::timeout this &ChatSocket::checkHeartbeat);

    m_data.clear();
    m_heartbeat->start();                 //开始心跳
}

ChatSocket::~ChatSocket()
{

}

void ChatSocket::heartbeat()
{
    if (!m_heartbeat->isActive())
        m_heartbeat->start();    
    m_lastTime = QDateTime::currentDateTime();
}

void ChatSocket::checkHeartbeat()
{
    if (m_lastTime.secsTo(QDateTime::currentDateTime()) >= 30)   //检测掉线,停止心跳
    {
        qDebug() << “heartbeat 超时 即将断开连接“;
        m_heartbeat->stop();
        disconnectFromHost();
    }
}

void ChatSocket::onDisconnected()
{
    emit clientDisconnected(peerAddress().toString());
    emit consoleMessage(peerAddress().toString() + “ 断开连接..“);
    deleteLater();
}

void ChatSocket::readClientData()
{
    static int got_size = 0;
    static MSG_TYPE type = MT_UNKNOW;
    static MSG_MD5_TYPE md5;

    if (m_data.size() == 0)  //必定为消息头
    {        
        QDataStream in(this);
        in.setVersion(QDataStream::Qt_5_9);

        MSG_FLAG_TYPE flag;
        in >> flag;
        if (flag != MSG_FLAG)
            return;

        in >> type;
        if (type == MT_HEARTBEAT)           //心跳检测,直接返回
            return;

        MSG_SIZE_TYPE size;
        in >> size >> md5;
        m_data.resize(size);
    }
    else                                //合并数据
    {
        QByteArray data = read(bytesAvailable());
        m_data.replace(got_size data.size() data);
        got_size += data.size();
    }

    if (got_size == m_data.size())     //接收完毕
    {
        QByteArray md5_t = QCryptographicHash::hash(m_data QCryptographicHash::Md5);
        if (md5 == md5_t)   //正确的消息
        {
            QString str = QString::fromLocal8Bit(m_data.data());
            emit consoleMessage(QString(“md5 一致,消息为:\““ + str + “\“,大小:“ + QString::number(m_data.size())));
            switch (type)
            {
            case MT_SHAKE:

                break;
            case MT_TEXT:

                break;
            default:
                break;
            }
        }

        got_size = 0;           //重新开始
        type = MT_UNKNOW;
        md5.clear();
        m_data.clear();
    }

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     382534  2017-10-16 12:14  ChatServer\9.jpg

     文件       1259  2018-04-11 21:24  ChatServer\ChatServer.pro

     文件       3141  2018-04-13 19:25  ChatServer\chatsocket.cpp

     文件        636  2018-04-13 19:42  ChatServer\chatsocket.h

     文件       2112  2018-04-13 19:11  ChatServer\chattcpserver.cpp

     文件        513  2018-04-13 17:16  ChatServer\chattcpserver.h

     文件        404  2018-04-13 20:30  ChatServer\main.cpp

     文件       5427  2018-04-13 18:06  ChatServer\main.qml

     文件        835  2018-04-13 12:43  ChatServer\mymessagedef.h

     文件      12431  2018-04-13 20:30  fortuneclient\client.cpp

     文件       3487  2018-04-12 21:02  fortuneclient\client.h

     文件        235  2018-04-13 20:40  fortuneclient\fortuneclient.pro

     文件      24016  2018-04-13 20:40  fortuneclient\fortuneclient.pro.user

     文件       2771  2017-06-28 17:54  fortuneclient\main.cpp

     目录          0  2018-04-13 20:36  ChatServer

     目录          0  2018-04-13 20:40  fortuneclient

----------- ---------  ---------- -----  ----

               439801                    16


评论

共有 条评论