Qt基于TCP网络程序发包封包抽象

之前没经验, 发送数据包的时候, 包头包尾等信息都是通过重新定义一个结构体实现, 不同的协议包就有不同的结构体, 结果导致这样的现象: 有多少上层业务协议包, 我就分别重新定义一个对应的加上包头包尾的新的结构体, 很费劲.......额....

现在, 重新想了下, 一个改进的方式, 把"封包"过程抽象出来, 使用Qt的QByteArray来操作流数据(还是挺方便的)

.h

#ifndef PACKET_H
#define PACKET_H

#include <QObject>
#include <QByteArray>

#define FrontPacket     "KT"
#define EndPacket       "END"

//把数据封包, 加上包头包尾包长标志校验
class Packet : public QObject
{
    Q_OBJECT
public:
    explicit Packet(QObject *parent = 0);
    
    static QByteArray Pack(QByteArray data);   //封包
};

#endif // PACKET_H

.cpp

#include "packet.h"


Packet::Packet(QObject *parent) :
    QObject(parent)
{
}

QByteArray Packet::Pack(QByteArray data)
{
    QByteArray pack;
    pack.append(FrontPacket);
    quint32 len = 4 + data.size() + 4 + 3;
    pack.append(reinterpret_cast<const char*>(&len), 4);
    quint32 flag = 0;
    pack.append(reinterpret_cast<const char*>(&flag), 4);
    pack.append(data);
    quint32 crc = 0;
    pack.append(reinterpret_cast<const char*>(&crc), 4);
    pack.append(EndPacket);
    return pack;
}

然后, 在上层界面操作时候, 可以用定义好的上层协议结构体对象直接转成字节流QByteArray类型然后发往底层网络的发送数据接口, 在底层发送数据接口中, send数据前, 先把传进来的协议数据包传到上边封装好的静态类成员Pack()中处理一下, 就可以把返回值直接send了

好处: 上层业务, 只要封装好上层协议数据, 就可以调用网络底层一个统一的发送数据接口进行发包(本挫人之前这样做:底层网络提供了针对不同协议包有不同的接口方法, 然后每添加一条新协议, 就要添加一个成员函数, 每删删除一条协议, 就要.....111111111111111111)

完.....................................................

原文地址:https://www.cnblogs.com/jianc/p/2881651.html