zoukankan      html  css  js  c++  java
  • QDataStream对QVector的序列化

    最近发现QDataStream这个好东东,序列化发送数据很方便,与大家分享一下。

    客户端:

    line.h

     1 #ifndef LINE_H
     2 #define LINE_H
     3 #include <QString>
     4 
     5 class Line
     6 {
     7 public:
     8     Line();
     9 
    10 public:
    11     int pointX;
    12     int pointY;
    13     int pointZ;
    14 
    15     QString pointName;
    16 
    17 public:
    18     void getPoint();
    19     void setPoint();
    20 
    21 };
    22 
    23 #endif // LINE_H

    line.cpp

     1 #include "line.h"
     2 
     3 Line::Line()
     4 {
     5 }
     6 
     7 
     8 void Line::getPoint()
     9 {
    10 
    11 }
    12 
    13 void Line::setPoint()
    14 {
    15 
    16 }


    myvector.h

     1 #ifndef MYVECTOR_H
     2 #define MYVECTOR_H
     3 
     4 #include <QVector>
     5 #include <QDebug>
     6 #include "line.h"
     7 
     8 class MyVector:public QVector<Line>
     9 {
    10 public:
    11     MyVector();
    12 
    13     friend QDataStream& operator <<(QDataStream &out,MyVector &myVector);
    14 
    15     friend QDataStream& operator >>(QDataStream &in,MyVector &myVector);
    16 
    17     int x;
    18 };
    19 
    20 class ChildVector:public MyVector
    21 {
    22 public:
    23     ChildVector();
    24 
    25 public:
    26     friend QDataStream& operator <<(QDataStream &out,ChildVector &childVector);
    27 
    28     friend QDataStream& operator >>(QDataStream &in,ChildVector &childVector);
    29 
    30     int y;
    31     int z;
    32     int childData;
    33 
    34 };
    35 
    36 #endif // MYVECTOR_H

    myvector.cpp

     1 #include "myvector.h"
     2 
     3 MyVector::MyVector()
     4 {
     5 }
     6 
     7 
     8 QDataStream& operator <<(QDataStream &out,MyVector &myVector)
     9 {
    10     out << quint32(myVector.size());
    11     qDebug() <<"myVector---size()"<<myVector.size()<<endl;
    12 
    13     for (typename QVector<Line>::const_iterator it = myVector.begin(); it != myVector.end(); ++it)
    14     {
    15         out << it->pointName << it->pointX << it->pointY << it->pointZ;
    16         qDebug()<<"it->pointName####"<<it->pointName<<"it->pointX$$$$$"<<it->pointX<<"it->pointY%%%%"<<it->pointY<<"it->pointZ^^^^^"<<it->pointZ<<endl;
    17     }
    18     out << myVector.x;
    19     return out;
    20 }
    21 
    22 
    23 
    24 QDataStream& operator >>(QDataStream &in,MyVector &myVector)
    25 {
    26     myVector.clear();
    27     quint32 c;
    28     in >> c;
    29     myVector.resize(c);
    30     for(quint32 i = 0;i < c;++i)
    31     {
    32         Line tLine;
    33         in >> tLine.pointName >> tLine.pointX >> tLine.pointY >> tLine.pointZ;
    34     }
    35     in >> myVector.x;
    36     return in;
    37 }
    38 
    39 ChildVector::ChildVector()
    40 {
    41 
    42 }
    43 
    44 QDataStream& operator <<(QDataStream &out,ChildVector &childVector)
    45 {
    46     qDebug() <<"myVector---size()"<<childVector.size()<<endl;
    47 
    48     MyVector *kk = &childVector;
    49     out << *kk;
    50     out << childVector.y << childVector.z<<childVector.childData;
    51     return out;
    52 }
    53 
    54 QDataStream& operator >>(QDataStream &in,ChildVector &childVector)
    55 {
    56     MyVector *kk = &childVector;
    57     in << *kk;
    58     in >> childVector.y >> childVector.z >> childVector.childData;
    59 
    60     return in;
    61 }

    tcpclient.h

     1 #ifndef TCPCLIENT_H
     2 #define TCPCLIENT_H
     3 
     4 #include <QObject>
     5 #include <QDataStream>
     6 #include <Qt/qtcpserver.h>
     7 #include <Qt/qtcpsocket.h>
     8 #include <Qt/qhostinfo.h>
     9 #include <Qt/qhostaddress.h>
    10 
    11 #include "myvector.h"
    12 
    13 class TcpClient : public QObject
    14 {
    15     Q_OBJECT
    16 public:
    17     //explicit TcpClient(QObject *parent = 0);
    18     TcpClient():m_iOut(&byteArrayWrite,QIODevice::WriteOnly)
    19     {
    20         m_nPort = 8080;
    21         m_bStatus = false;
    22         tcpClient = NULL;
    23 
    24         //设置数据流的版本,客户端和服务器端使用的版本要相同
    25         m_iOut.setVersion(QDataStream::Qt_4_6);
    26         //设置发送长度初始值为0
    27         m_iOut<<(quint32)0;
    28     }
    29 
    30 signals:
    31 
    32 public slots:
    33     void slotGetStatus();
    34 
    35 public:
    36     void initConnection(QString ip);
    37     void updata();
    38 
    39     QDataStream m_iIn;
    40     QDataStream m_iOut;
    41     QByteArray byteArrayWrite;
    42 
    43     QTcpSocket *tcpClient;
    44 
    45     //MyVector myVector;
    46 
    47     QString m_sIpAddress;
    48     int m_nPort;
    49     bool m_bStatus;
    50 };
    51 
    52 #endif // TCPCLIENT_H

    tcpclient.cpp

     1 #include "tcpclient.h"
     2 
     3 //TcpClient::TcpClient(QObject *parent) :
     4 //    QObject(parent)
     5 //{
     6 
     7 //}
     8 
     9 void TcpClient::initConnection(QString ip)
    10 {
    11     m_sIpAddress = ip;
    12     QHostAddress address;
    13     address.setAddress(ip);
    14 
    15     if(tcpClient == NULL)
    16     {
    17         tcpClient = new QTcpSocket(this);
    18     }
    19 
    20     tcpClient->abort();
    21 
    22     tcpClient->connectToHost(address,8080);
    23 
    24 
    25 
    26     //connect(tcpClient,SIGNAL(readyRead()),this,SLOT(readData()));
    27     //connect(tcpClient,SIGNAL(disconnected()),this,SLOT(slotDisconnect()));
    28     //connect(tcpClient,SIGNAL(connected()),this,SLOT(sendData()));
    29     m_bStatus = connect(tcpClient,SIGNAL(connected()),this,SLOT(slotGetStatus()));
    30 
    31     while(!m_bStatus)
    32     {
    33         initConnection(m_sIpAddress);
    34     }
    35 }
    36 
    37 void TcpClient::slotGetStatus()
    38 {
    39 
    40 }
    41 
    42 void TcpClient::updata()
    43 {
    44     //回到字节流起始位置
    45     m_iOut.device()->seek(0);
    46     //重置字节流长度
    47     m_iOut << (quint32) (byteArrayWrite.size()-sizeof(quint32));
    48     //往套接字缓存中写入数据,并发送
    49     int writeBlock = tcpClient->write(byteArrayWrite);
    50 
    51     qDebug()<<"writeBlock******"<<writeBlock;
    52 
    53     byteArrayWrite.resize(0);
    54 
    55     tcpClient->waitForReadyRead(1000);
    56 }

    test.h

     1 #ifndef TEST_H
     2 #define TEST_H
     3 
     4 #include <QObject>
     5 #include "tcpclient.h"
     6 
     7 class Test : public QObject
     8 {
     9     Q_OBJECT
    10 public:
    11     explicit Test(QObject *parent = 0);
    12 
    13 signals:
    14 
    15 public slots:
    16     void getData();
    17 
    18 public:
    19      TcpClient *tcpClt;
    20 };
    21 
    22 #endif // TEST_H

    test.cpp

     1 #include "test.h"
     2 
     3 Test::Test(QObject *parent) :
     4     QObject(parent)
     5 {
     6     tcpClt = new TcpClient();
     7 }
     8 
     9 void Test::getData()
    10 {
    11     QString ipAddress("192.168.154.128");
    12 
    13     tcpClt->initConnection(ipAddress);
    14 
    15     ChildVector myVector;
    16 
    17     Line tLine;
    18     for(int i = 0;i < 10;i++)
    19     {
    20         tLine.pointName = QString("test")+QString::number(i);
    21         tLine.pointX = 100 + i*10;
    22         tLine.pointY = 150 + i*100;
    23         tLine.pointZ = 5000 + i*1000;
    24         myVector.append(tLine);
    25     }
    26 
    27     myVector.x = 1000;
    28     myVector.y = 2000;
    29     myVector.z = 3000;
    30     myVector.childData = 30;
    31 
    32     tcpClt->m_iOut << myVector;
    33 
    34     tcpClt->updata();
    35 }

    服务端接收:

    line.h  line.cpp,myvector.h myvector.cpp不再添加,同客户端

    tcpserver.h

     1 #ifndef TCPSERVER_H
     2 #define TCPSERVER_H
     3 
     4 #include <Qt/qtcpserver.h>
     5 #include <Qt/qtcpsocket.h>
     6 #include <Qt/qhostinfo.h>
     7 #include <Qt/qhostaddress.h>
     8 #include <Qt/qnetworkinterface.h>
     9 #include <QObject>
    10 
    11 #include "myvector.h"
    12 
    13 class TcpServer : public QObject
    14 {
    15     Q_OBJECT
    16 public:
    17     explicit TcpServer(QObject *parent = 0,int port = 8080);
    18 
    19     ChildVector myVector;
    20 
    21 signals:
    22 
    23 public slots:
    24     void readData();
    25     //void deleteSlot();
    26     void slotConnected();
    27 
    28 private:
    29     QTcpServer *m_pServer;
    30     QTcpSocket *m_pTcpClientSocket;
    31 
    32 
    33 };
    34 
    35 #endif // TCPSERVER_H

    tcperver.cpp

     1 #include "tcpserver.h"
     2 
     3 int GLOBAL_LENGTH = 0;
     4 
     5 TcpServer::TcpServer(QObject *parent, int port) :
     6     QObject(parent)
     7 {
     8     m_pServer = new QTcpServer(this);
     9     if(m_pServer->listen(QHostAddress::Any,port))
    10     {
    11           qDebug()<<"listen Successfully!!!";
    12     }
    13     connect(m_pServer,SIGNAL(newConnection()),this,SLOT(slotConnected()));
    14 }
    15 
    16 void TcpServer::slotConnected()
    17 {
    18     qDebug()<<"slotConnected!!!";
    19     m_pTcpClientSocket = m_pServer->nextPendingConnection();
    20 
    21     bool bConnect = connect(m_pTcpClientSocket,SIGNAL(readyRead()),this,SLOT(readData()));
    22     //connect(m_pTcpClientSocket,SIGNAL(disconnected()),m_pTcpClientSocket,SLOT(deleteLater()));
    23     qDebug()<<"bConnect"<<bConnect;
    24 }
    25 
    26 void TcpServer::readData()
    27 {
    28     quint32 nextBlockSize = 0;
    29     QDataStream in(m_pTcpClientSocket);
    30     in.setVersion(QDataStream::Qt_4_6);
    31     quint32 bufferSize = m_pTcpClientSocket->bytesAvailable();
    32     if(nextBlockSize == 0)
    33     {
    34         if(m_pTcpClientSocket->bytesAvailable()<sizeof(quint32))
    35         {
    36             return;
    37         }
    38         in>>nextBlockSize;
    39         qDebug()<<"nextBlockSize:"<<nextBlockSize<<"m_pTcpClientSocket->bytesAvailable()"<<m_pTcpClientSocket->bytesAvailable();
    40     }
    41 
    42     GLOBAL_LENGTH = nextBlockSize/sizeof(quint32);
    43 
    44     in >> myVector;
    45     //qDebug()<<"-------------"<<myVector.x<<"@@@@@@@@@@"<<"myVector.size()#####"<<myVector.size()<<endl;
    46      for(int i = 0; i < myVector.size() ;i++)
    47      {
    48          qDebug()<<"***********"<<myVector.at(i).pointName<<"###";
    49          qDebug()<<"***********"<<myVector.at(i).pointX<<"###";
    50          qDebug()<<"***********"<<myVector.at(i).pointY<<"###";
    51          qDebug()<<"***********"<<myVector.at(i).pointZ<<"###"<<endl;
    52      }
    53 
    54      qDebug()<<"-------------"<<myVector.x<<"@@@@@@@@@@"<<"myVector.y#####"<<myVector.y<<"@@@@@@@@@@"<<"myVector.y#####"<<myVector.z<<"childData-----"<<myVector.childData<<endl;
    55      if(nextBlockSize==0xFFFF)
    56      {
    57          return;
    58      }
    59      if(bufferSize < nextBlockSize)
    60      {
    61          return;
    62      }
    63 }

    以上代码经过编译测试通过,希望对你有所帮助。

  • 相关阅读:
    java基础学习笔记四(异常)
    关于linux下crontab mysql备份出来的数据为0字节的问题
    转:国内优秀npm镜像推荐及使用
    webpack使用总结~
    php下载远程文件方法~
    腾讯开放平台web第三方登录获取信息类(包含签名)
    windows 平台 php_Imagick 拓展遇到的那些坑!
    转:CentOS/Debian/Ubuntu一键安装LAMP(Apache/MySQL/PHP)环境
    composer 报错:Your requirements could not be resolved to an installable set of packages 解决方法
    Javascript模块化编程(三):require.js的用法
  • 原文地址:https://www.cnblogs.com/wanzaiyimeng/p/4616984.html
Copyright © 2011-2022 走看看