当前位置:   article > 正文

JsonSockketTcp套接字 for qt(json数据流传输层)_qt tcp传输 json

qt tcp传输 json

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

数据流格式:

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

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


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/522914
推荐阅读
相关标签
  

闽ICP备14008679号