在已经实现socket通信的前提下,设计了如下的通信格式:
假设cmd定义如下:
#ifndef CMD_H
#define CMD_H
//服务器------->客户端
#define Connet_Success 0x0F00 //连接成功应答包
#define Login_answer 0x0F01 //登陆结果(也是QString 的一种)
#define QString_send 0x0F02 //发送字符串
#define QFile_send 0x0F03 //发送文件
#define Struct_send 0x0F03 //发送结构体
//客户端------->服务器
#define Login 0x0D00 //客户端登陆
#endif // CMD_H
一些变量说明:
qint64 totalBytes; //一个数据包MSG部分的完整大小
qint64 recvdBytes; //已经收到的字节数
qint64 serverCmd; //接受数据包的类型
QByteArray inBlock; //接受缓冲
QByteArray m_buffer; //缓存上一次或多次的未处理的数据
QFile *localFile;
QSqlDatabase db;
QMutex mutex;
- 发送QString字符串
void mySocket::sendMSG(QString msg, qint64 cmd)
{
if(!isValid()) //确保连接仍然有效
{
qDebug()<<"losing connect.......";
return;
}
/********************构造数据包************************/
qint64 totalBytes = 0;
QByteArray block; //用于暂存我们要发送的数据
QDataStream output(&block,QIODevice::WriteOnly);//使用数据流写入数据
output.setVersion(QDataStream::Qt_5_2);
totalBytes = msg.toUtf8().si