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

现在, 重新想了下, 一个改进的方式, 把"封包"过程抽象出来, 使用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/archive/2013/01/29/2881651.html

Qt基于TCP网络程序发包封包抽象相关推荐

  1. Qt基于tcp网络服务器的简易版多人贪吃蛇小游戏(多线程)

    文章目录 前言 一.项目的简单介绍 二.总体步骤 1.服务器端 2 客户端 总结 前言 花费一周的时间,搭建了一个自己的破烂服务器,以此记录我那逝去的时间 一.项目的简单介绍 这是一个多人贪吃蛇游戏, ...

  2. 黑马程序员——网络编程(二)--TCP网络程序、访问Internet网络资源

    -------  android培训.java培训.期待与您交流! ---------- 第一部分 TCP网络程序 一.TCP网络程序的工作原理 TCP客户端程序与TCP服务器程序的交互过程: (1) ...

  3. Python中基于TCP网络通信协议的多人聊天室

    1.服务端设置 1.1 相关配置信息 便于后期维护修改,将数据协议的相关配置和服务器配置,以及登录验证的数据库信息单独建立一个.py文件.需根据自己服务器ip修改. #------数据协议相关配置-- ...

  4. 基于TCP协议的网络程序(基础学习)

    下图是基于TCP协议的客户端/服务器程序的一般流程: 图 37.2. TCP协议通讯流程 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听 ...

  5. java tcp 编程实例_Java实现基于TCP的通讯程序实例解析

    Java中的TCP通信程序 TCP可以实现两台计算机之间的数据交互通信的两端,要严格区分客户端与服务端 两端通信时的步骤: 1.服务端程序,需要事先启动,等待客户端连接 2.客户端主动连接服务器端,才 ...

  6. QT示例:基于TCP 点对多Socket通讯(server,clients)

    QT示例:基于TCP 点对多通讯(server,clients) 一.服务器server 二.客户端Client 下载:基于TCP 点对多Socket通讯 一.服务器server 因为对于客户端来说, ...

  7. Java笔记整理七(网络编程,TCP通信程序,函数式接口,方法引用)

    网络编程入门 1.软件结构 C/S结构 :全称为Client/Server结构,是指客户端和服务器结构.常见程序有QQ.迅雷等软件. B/S结构 :全称为Browser/Server结构,是指浏览器和 ...

  8. 解决TCP网络传输“粘包”问题

    当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API).TCP/IP传输层有两个并列的协议:TCP和UDP.其中TCP(transport contro ...

  9. UNIX网络编程——解决TCP网络传输“粘包”问题

           当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API).TCP/IP传输层有两个并列的协议:TCP和UDP.其中TCP(transport ...

最新文章

  1. 调侃 -- 刚入职时的单纯
  2. 一文了解PL610-01-O96TC-R
  3. 像证券交易员一样思考_2.理解绝招
  4. docker-compose配置redis服务
  5. NOIP2012:疫情控制(二分、贪心、树上倍增)
  6. [渝粤题库]陕西师范大学《幼儿园科学教育》作业
  7. Cloud Prizefight: OpenStack vs. VMware(转)-HA-FT
  8. Android音频开发(五)如何存储和解析最简单的音频wav文件
  9. python 加减法 负数_python解决两位数加减法快速出题问题
  10. 并发编程: 生产消费模型、死锁与Rlock、线程、守护线程、信号量、锁
  11. Python 黑帽子 netcat工具python3实现
  12. Java项目文件目录结构介绍
  13. 达梦数据库错误号6002:消息校验异常
  14. simulink方框_simulink模型引用
  15. 阿里云centos部署jsonserver
  16. java麻将算法_Java实现的麻将胡牌算法
  17. UNIX环境高级编程(APUE)读书笔记
  18. python从云端服务器读数据_云服务器简单实现Python自动运维
  19. MIUI 10——启用与关闭开发者模式/开发者选项
  20. dnf地下城虚拟机去虚拟化过鲁大师教程

热门文章

  1. C语言实现面向接口编程
  2. centos7 mysql启动后端口_centos7 修改mysql5.7默认端口后启动异常
  3. 飞畅科技-工业以太网的应用现状及前景展望
  4. 【渝粤教育】国家开放大学2018年秋季 1063t现代货币金融学说 参考试题
  5. 【渝粤题库】广东开放大学 面向对象方法精粹 形成性考核
  6. 基于Semtech LoRa SX1268 电路设计及PCB布局
  7. oracle tsn文件,无法启动OracleOraDB10g_home1TSNListener服务
  8. java中的规范是什么意思_Java中的异常规范有什么好处?
  9. StevenBoyd--Convex optimization--0. Contents
  10. QPSK信号调制之ASCII码