之前没经验, 发送数据包的时候, 包头包尾等信息都是通过重新定义一个结构体实现, 不同的协议包就有不同的结构体, 结果导致这样的现象: 有多少上层业务协议包, 我就分别重新定义一个对应的加上包头包尾的新的结构体, 很费劲.......额....
现在, 重新想了下, 一个改进的方式, 把"封包"过程抽象出来, 使用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)
完.....................................................