Qt之JsonSockketTcp套接字 for qt(json数据流传输层)

本文转自 https://blog.csdn.net/RuShrooM/article/details/25808297

主要处理tcp的json数据流,解析和除错json数据流,继承与 qtcpsocket层,方便扩展

数据流格式:

[cpp]  view plain  copy
  1. #ifndef CONFIGTCPSOCKET_H  
  2. #define CONFIGTCPSOCKET_H  
  3.   
  4. #include <QTcpSocket>  
  5. #include <QJsonDocument>  
  6.   
  7. class JsonTcpSocket : public QTcpSocket  
  8. {  
  9.   Q_OBJECT  
  10. public:  
  11.   explicit JsonTcpSocket(QObject *parent = 0);  
  12.   virtual ~JsonTcpSocket();  
  13.   const QString &getLastError()const{return lastErrorString;}  
  14.   const int &getLastCode()const{return lastErrorCode;}  
  15.   
  16.   
  17. public slots:  
  18.   bool write(const char *json);  
  19.   bool write(const QJsonDocument &json);  
  20.   bool write(const QByteArray &json);  
  21.   bool write(const QString &json);  
  22.   bool write(const QJsonObject &obj);  
  23.   
  24. signals:  
  25.   void newJsonData(const QJsonDocument &doc);//新的json数据  
  26.   void jsonError(const int &errorCode,const QString &errorString);//json格式错误  
  27.   void socketError(const int &errorCode,const QString &errorString);//网络错误  
  28.   
  29. private slots:  
  30.   void readBytes();//读取字节  
  31.   void networkError(QAbstractSocket::SocketError error);//网络错误  
  32.   
  33. private:  
  34.   int readByteCount=0;  
  35.   
  36.   QString lastErrorString; //最后的错误文字  
  37.   int lastErrorCode;//错误代码  
  38.   
  39. };  
  40.   
  41. #endif // CONFIGTCPSOCKET_H  

[cpp]  view plain  copy
  1. #include "jsontcpsocket.h"  
  2. #include <QDataStream>  
  3. #include "settingconfig.h"  
  4. #include <QByteArray>  
  5. #include <QThread>  
  6. #include "commonfunction.h"  
  7.   
  8. JsonTcpSocket::JsonTcpSocket(QObject *parent) :  
  9.   QTcpSocket(parent)  
  10. {  
  11.   
  12.   connect(this,&JsonTcpSocket::readyRead,this,&JsonTcpSocket::readBytes);  
  13.   
  14.   connect(this,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(networkError(QAbstractSocket::SocketError)));  
  15.   
  16.   this->setSocketOption(QAbstractSocket::LowDelayOption,"1"); //启用nagle低延迟算法  
  17.   this->setSocketOption(QAbstractSocket::KeepAliveOption,"1"); //设置保持连接状态  
  18.   
  19. }  
  20.   
  21. JsonTcpSocket::~JsonTcpSocket()  
  22. {  
  23.   
  24. }  
  25.   
  26. void JsonTcpSocket::readBytes()//读取字节  
  27. {  
  28.   if(this->readByteCount==0)  
  29.     {  
  30.       char peek;  
  31.       this->read(&peek,sizeof(peek));  
  32.   
  33.       if(peek=='l')   //查看是否是数据包的起始位置  
  34.         {  
  35.           char len[READ_RAW_LEN];//读取json数据的长度  
  36.   
  37.           this->read(len,sizeof(len));  
  38.   
  39.           ByteToInt(len,&this->readByteCount);  
  40.   
  41.         }else  //否则就丢弃全部的数据  
  42.         {  
  43.           this->readAll();  
  44.           //qDebug()<<"read all data:"<<this->readAll();  
  45.           return;  
  46.         }  
  47.     }  
  48.   
  49.   if(this->readByteCount>this->bytesAvailable())  
  50.     return;  
  51.   
  52.   char *json=new char[this->readByteCount];  
  53.   
  54.   this->read(json,this->readByteCount);  //读取json数据  
  55.   
  56.   this->readByteCount=0; //数据长度重设为0;  
  57.   
  58.   QJsonParseError parseError;  
  59.   QJsonDocument jsonDoc(QJsonDocument::fromJson(json,&parseError));  
  60.   
  61.   if(parseError.error==QJsonParseError::NoError)  //json格式是否正确  
  62.     {  
  63.       // qDebug()<<"read json data:"<<jsonDoc.toJson();  
  64.         emit newJsonData(jsonDoc); //发送json数据信号  
  65.     }  
  66.   else  
  67.     {  
  68.         this->lastErrorCode=parseError.error;  
  69.         this->lastErrorString=parseError.errorString();  
  70.         emit jsonError(parseError.error,parseError.errorString()); //发送错误代码  
  71.         qDebug()<<"json format error:"<<json;  
  72.     }  
  73.   
  74.   
  75.   delete []json;  
  76.   
  77.   this->readBytes(); //继续读取一下段数据  
  78. }  
  79.   
  80.   
  81. bool JsonTcpSocket::write(const char *json)  
  82. {  
  83.   return this->write(QJsonDocument::fromJson(json));  
  84. }  
  85.   
  86. bool JsonTcpSocket::write(const QByteArray &json)  
  87. {  
  88.   return this->write(QJsonDocument::fromJson(json));  
  89. }  
  90.   
  91. bool JsonTcpSocket::write(const QString &json)  
  92. {  
  93.   return this->write(QJsonDocument::fromVariant(json));  
  94. }  
  95.   
  96. bool JsonTcpSocket::write(const QJsonObject &obj)  
  97. {  
  98.   return this->write(QJsonDocument(obj));  
  99. }  
  100.   
  101. bool JsonTcpSocket::write(const QJsonDocument &json)  
  102. {  
  103.   
  104.   QByteArray array;  
  105.   array.prepend(json.toJson(QJsonDocument::Compact));  
  106.   
  107.   int len=array.length();  
  108.   char lenByte[READ_RAW_LEN];  
  109.   
  110.   IntToByte(len,lenByte);  
  111.   
  112.   array.prepend(lenByte,sizeof(lenByte));  
  113.   
  114.   array.prepend('l');  
  115.   
  116.   int bytes=-1;  
  117.   
  118.   bytes=QTcpSocket::write(array);  
  119.   
  120.   return bytes!=-1;  
  121. }  
  122.   
  123.   
  124. void JsonTcpSocket::networkError(QAbstractSocket::SocketError error)//网络错误  
  125. {  
  126.     this->lastErrorString=this->errorString();  
  127.     this->lastErrorCode=error;  
  128.     emit socketError(error,this->lastErrorString);  
  129. }  

猜你喜欢

转载自blog.csdn.net/u014252478/article/details/80364264