QDataStream对QVector的序列化
2015-07-02 19:25
393 查看
最近发现QDataStream这个好东东,序列化发送数据很方便,与大家分享一下。
客户端:
line.h
line.cpp
myvector.h
myvector.cpp
tcpclient.h
tcpclient.cpp
test.h
test.cpp
服务端接收:
line.h line.cpp,myvector.h myvector.cpp不再添加,同客户端
tcpserver.h
tcperver.cpp
以上代码经过编译测试通过,希望对你有所帮助。
客户端:
line.h
#ifndef LINE_H #define LINE_H #include <QString> class Line { public: Line(); public: int pointX; int pointY; int pointZ; QString pointName; public: void getPoint(); void setPoint(); }; #endif // LINE_H
line.cpp
#include "line.h" Line::Line() { } void Line::getPoint() { } void Line::setPoint() { }
myvector.h
#ifndef MYVECTOR_H #define MYVECTOR_H #include <QVector> #include <QDebug> #include "line.h" class MyVector:public QVector<Line> { public: MyVector(); friend QDataStream& operator <<(QDataStream &out,MyVector &myVector); friend QDataStream& operator >>(QDataStream &in,MyVector &myVector); int x; }; class ChildVector:public MyVector { public: ChildVector(); public: friend QDataStream& operator <<(QDataStream &out,ChildVector &childVector); friend QDataStream& operator >>(QDataStream &in,ChildVector &childVector); int y; int z; int childData; }; #endif // MYVECTOR_H
myvector.cpp
#include "myvector.h" MyVector::MyVector() { } QDataStream& operator <<(QDataStream &out,MyVector &myVector) { out << quint32(myVector.size()); qDebug() <<"myVector---size()"<<myVector.size()<<endl; for (typename QVector<Line>::const_iterator it = myVector.begin(); it != myVector.end(); ++it) { out << it->pointName << it->pointX << it->pointY << it->pointZ; qDebug()<<"it->pointName####"<<it->pointName<<"it->pointX$$$$$"<<it->pointX<<"it->pointY%%%%"<<it->pointY<<"it->pointZ^^^^^"<<it->pointZ<<endl; } out << myVector.x; return out; } QDataStream& operator >>(QDataStream &in,MyVector &myVector) { myVector.clear(); quint32 c; in >> c; myVector.resize(c); for(quint32 i = 0;i < c;++i) { Line tLine; in >> tLine.pointName >> tLine.pointX >> tLine.pointY >> tLine.pointZ; } in >> myVector.x; return in; } ChildVector::ChildVector() { } QDataStream& operator <<(QDataStream &out,ChildVector &childVector) { qDebug() <<"myVector---size()"<<childVector.size()<<endl; MyVector *kk = &childVector; out << *kk; out << childVector.y << childVector.z<<childVector.childData; return out; } QDataStream& operator >>(QDataStream &in,ChildVector &childVector) { MyVector *kk = &childVector; in << *kk; in >> childVector.y >> childVector.z >> childVector.childData; return in; }
tcpclient.h
#ifndef TCPCLIENT_H #define TCPCLIENT_H #include <QObject> #include <QDataStream> #include <Qt/qtcpserver.h> #include <Qt/qtcpsocket.h> #include <Qt/qhostinfo.h> #include <Qt/qhostaddress.h> #include "myvector.h" class TcpClient : public QObject { Q_OBJECT public: //explicit TcpClient(QObject *parent = 0); TcpClient():m_iOut(&byteArrayWrite,QIODevice::WriteOnly) { m_nPort = 8080; m_bStatus = false; tcpClient = NULL; //设置数据流的版本,客户端和服务器端使用的版本要相同 m_iOut.setVersion(QDataStream::Qt_4_6); //设置发送长度初始值为0 m_iOut<<(quint32)0; } signals: public slots: void slotGetStatus(); public: void initConnection(QString ip); void updata(); QDataStream m_iIn; QDataStream m_iOut; QByteArray byteArrayWrite; QTcpSocket *tcpClient; //MyVector myVector; QString m_sIpAddress; int m_nPort; bool m_bStatus; }; #endif // TCPCLIENT_H
tcpclient.cpp
#include "tcpclient.h" //TcpClient::TcpClient(QObject *parent) : // QObject(parent) //{ //} void TcpClient::initConnection(QString ip) { m_sIpAddress = ip; QHostAddress address; address.setAddress(ip); if(tcpClient == NULL) { tcpClient = new QTcpSocket(this); } tcpClient->abort(); tcpClient->connectToHost(address,8080); //connect(tcpClient,SIGNAL(readyRead()),this,SLOT(readData())); //connect(tcpClient,SIGNAL(disconnected()),this,SLOT(slotDisconnect())); //connect(tcpClient,SIGNAL(connected()),this,SLOT(sendData())); m_bStatus = connect(tcpClient,SIGNAL(connected()),this,SLOT(slotGetStatus())); while(!m_bStatus) { initConnection(m_sIpAddress); } } void TcpClient::slotGetStatus() { } void TcpClient::updata() { //回到字节流起始位置 m_iOut.device()->seek(0); //重置字节流长度 m_iOut << (quint32) (byteArrayWrite.size()-sizeof(quint32)); //往套接字缓存中写入数据,并发送 int writeBlock = tcpClient->write(byteArrayWrite); qDebug()<<"writeBlock******"<<writeBlock; byteArrayWrite.resize(0); tcpClient->waitForReadyRead(1000); }
test.h
#ifndef TEST_H #define TEST_H #include <QObject> #include "tcpclient.h" class Test : public QObject { Q_OBJECT public: explicit Test(QObject *parent = 0); signals: public slots: void getData(); public: TcpClient *tcpClt; }; #endif // TEST_H
test.cpp
#include "test.h" Test::Test(QObject *parent) : QObject(parent) { tcpClt = new TcpClient(); } void Test::getData() { QString ipAddress("192.168.154.128"); tcpClt->initConnection(ipAddress); ChildVector myVector; Line tLine; for(int i = 0;i < 10;i++) { tLine.pointName = QString("test")+QString::number(i); tLine.pointX = 100 + i*10; tLine.pointY = 150 + i*100; tLine.pointZ = 5000 + i*1000; myVector.append(tLine); } myVector.x = 1000; myVector.y = 2000; myVector.z = 3000; myVector.childData = 30; tcpClt->m_iOut << myVector; tcpClt->updata(); }
服务端接收:
line.h line.cpp,myvector.h myvector.cpp不再添加,同客户端
tcpserver.h
#ifndef TCPSERVER_H #define TCPSERVER_H #include <Qt/qtcpserver.h> #include <Qt/qtcpsocket.h> #include <Qt/qhostinfo.h> #include <Qt/qhostaddress.h> #include <Qt/qnetworkinterface.h> #include <QObject> #include "myvector.h" class TcpServer : public QObject { Q_OBJECT public: explicit TcpServer(QObject *parent = 0,int port = 8080); ChildVector myVector; signals: public slots: void readData(); //void deleteSlot(); void slotConnected(); private: QTcpServer *m_pServer; QTcpSocket *m_pTcpClientSocket; }; #endif // TCPSERVER_H
tcperver.cpp
#include "tcpserver.h" int GLOBAL_LENGTH = 0; TcpServer::TcpServer(QObject *parent, int port) : QObject(parent) { m_pServer = new QTcpServer(this); if(m_pServer->listen(QHostAddress::Any,port)) { qDebug()<<"listen Successfully!!!"; } connect(m_pServer,SIGNAL(newConnection()),this,SLOT(slotConnected())); } void TcpServer::slotConnected() { qDebug()<<"slotConnected!!!"; m_pTcpClientSocket = m_pServer->nextPendingConnection(); bool bConnect = connect(m_pTcpClientSocket,SIGNAL(readyRead()),this,SLOT(readData())); //connect(m_pTcpClientSocket,SIGNAL(disconnected()),m_pTcpClientSocket,SLOT(deleteLater())); qDebug()<<"bConnect"<<bConnect; } void TcpServer::readData() { quint32 nextBlockSize = 0; QDataStream in(m_pTcpClientSocket); in.setVersion(QDataStream::Qt_4_6); quint32 bufferSize = m_pTcpClientSocket->bytesAvailable(); if(nextBlockSize == 0) { if(m_pTcpClientSocket->bytesAvailable()<sizeof(quint32)) { return; } in>>nextBlockSize; qDebug()<<"nextBlockSize:"<<nextBlockSize<<"m_pTcpClientSocket->bytesAvailable()"<<m_pTcpClientSocket->bytesAvailable(); } GLOBAL_LENGTH = nextBlockSize/sizeof(quint32); in >> myVector; //qDebug()<<"-------------"<<myVector.x<<"@@@@@@@@@@"<<"myVector.size()#####"<<myVector.size()<<endl; for(int i = 0; i < myVector.size() ;i++) { qDebug()<<"***********"<<myVector.at(i).pointName<<"###"; qDebug()<<"***********"<<myVector.at(i).pointX<<"###"; qDebug()<<"***********"<<myVector.at(i).pointY<<"###"; qDebug()<<"***********"<<myVector.at(i).pointZ<<"###"<<endl; } qDebug()<<"-------------"<<myVector.x<<"@@@@@@@@@@"<<"myVector.y#####"<<myVector.y<<"@@@@@@@@@@"<<"myVector.y#####"<<myVector.z<<"childData-----"<<myVector.childData<<endl; if(nextBlockSize==0xFFFF) { return; } if(bufferSize < nextBlockSize) { return; } }
以上代码经过编译测试通过,希望对你有所帮助。
相关文章推荐
- TCP 组播 广播
- Spyder常用环境working directory设置
- poj 3616 奶牛产奶时间间隔dp
- 读博分析
- OC - 类目、延展、协议
- java学习06--比较运算符和逻辑运算符
- 【Web探索之旅】第四部分:Web程序员
- Nginx 在windows下配合iis搭建负载均衡过程
- android开发,设置listview的高度无效
- MYSQL远程访问设置
- 解读Cardinality Estimation算法(第三部分:LogLog Counting)
- iOS9适配系列教程
- iOS9适配系列教程
- 【Web探索之旅】第三部分第三课:协议
- AMD Geode GX processor L1 DCache扩容验证方法
- mysql重连,连接丢失:The last packet successfully received from the server
- SIFT算法
- 【学习笔记】【C语言】条件编译
- Android网络编程中关于AsyncHttpClient获取cookie的问题
- #定位系统性能瓶颈# 序言