QT网络编程解说
很多人在编写网络代码的时候,客户端代码编写的功能总不能胜任所需要的功能能力,现在我将编写网络代码所需要遵循的规范输出出来,帮助别的人梳理对网络的认识。
连接网络和服务器通信的过程:连接,断开属于开关的时间。中途所有的数据消息都遵循如下过程:
打包数据,
打包消息,
发送消息,
接收消息,
解包消息,
解包数据。
应用对数据进行发送前和接收后的处理。
QTcpSocket网络编程细节
qteclientmessage负责将服务器协议上的数据进行解包和打包;qteclientdata负责将协议内的数据段进行打包和解包;qteclient负责网络的连接和断开和封装网络传动功能接口;
这个例程用心跳来说明了网络传输的过程,例程的终点在reayReadData,在这个函数里,处理了粘包,数据不足的情况等
qteclientmessage.h
#ifndef QTEMESSAGE_H
#define QTEMESSAGE_H
#include "QTEDefine.h"
#define _TCPCMD_TAGHEAD 0xEECC
#define _TCPCMD_TAGTAIL 0xCCEE
#define _TCPCMD_HEART 0x0000
#define _TCPCMD_HEART_RSP 0x8000
#define _TCP_BLOCKDATA_SIZE 0x400
#define _TCP_RECVBUFF_SIZE 0x800
typedef struct tagHeartBeat
{
quint8 m_tipJ;
QString m_content;
}QTEHeartBeat;
typedef struct tagHeartBeatRsp
{
quint16 m_tipJJ;
QString m_content;
}QTEHeartBeatRsp;
class QTEClientMessage : public QObject
{
Q_OBJECT
public:
explicit QTEClientMessage(QObject *parent = 0);
const quint16& head() const { return m_Head; }
void setHead(quint16 head) { m_Head = head; }
const quint16& size() const { return m_Size; }
void setSize(quint16 size) { m_Size = size; }
const quint16& cmd() const { return m_Cmd; }
void setCmd(quint16 cmd) { m_Cmd = cmd; }
const QByteArray& data() const { return m_Data; }
void setData(QByteArray& data) { m_Data = data; }
const quint16& sum() const { return m_Sum; }
void setSum(quint16 sum) { m_Sum = sum; }
const quint32& tail() const { return m_Tail; }
void setTail(quint32 tail) { m_Tail = tail; }
void translate();
signals:
public slots:
private:
quint16 m_Head;
quint16 m_Size;
quint16 m_Cmd;
QByteArray m_Data;
quint16 m_Sum;
quint32 m_Tail;
};
QDebug operator<< (QDebug dbg, const QTEClientMessage &c);
class QTEClientParser : public QObject
{
public:
explicit QTEClientParser(QObject *parent = 0) : QObject(parent) {}
static quint16 parseBlockSize(const QByteArray &netData);
static void parse(QTEClientMessage& getter, const QByteArray &netData);
static void pack(QByteArray& netData, const QTEClientMessage& setter);
private:
};
class QTEClientData : public QObject
{
Q_OBJECT
public:
explicit QTEClientData(QObject *parent = 0) : QObject(parent) {}
template <typename T