赞
踩
客户端:
client.h
#ifndef CLIENT_H #define CLIENT_H #include <QTcpSocket> #include <QObject> class client : public QObject { Q_OBJECT public: explicit client(QObject *parent = nullptr); void setAddress(QString ip); void setPort(quint16 port); void start(); void sendData(QByteArray data); signals: public slots: private: QTcpSocket *tcpsocket =NULL; QString m_strip; quint16 m_port; }; #endif // CLIENT_H
datadefine.h
#ifndef DATADEFINE_H #define DATADEFINE_H #include<QtGlobal> #include<QObject> struct head { //"@@&&" quint8 sop[4];//头占4个字节 //数据长度 qint32 length;//4个字节 //数据类型 quint32 type;//2个字节 }; struct databuf { short data[16]; }; struct str_data { char buffer[32]; }; #endif // DATADEFINE_H
widget.h
#ifndef WIDGET_H #define WIDGET_H #include "client.h" #include <QWidget> #include "datadefine.h" namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); void init(); private slots: void on_connectBtn_clicked(); void on_sendDataBtn_clicked(); void on_sendStrBtn_clicked(); void on_pushButton_clicked(); private: Ui::Widget *ui; client *myClient; head _head; double* dataSend; }; #endif // WIDGET_H
cpp部分
#include "client.h" client::client(QObject *parent) : QObject(parent) { tcpsocket = new QTcpSocket; } void client::setAddress(QString ip) { m_strip = ip; } void client::setPort(quint16 port) { m_port = port; } void client::start() { tcpsocket->connectToHost(m_strip,m_port); } void client::sendData(QByteArray data) { tcpsocket->write(data); tcpsocket->flush(); }
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); setWindowTitle("Client"); } Widget::~Widget() { delete ui; delete []dataSend; } void Widget::init() { myClient= new client; myClient->setAddress(ui->ipLed->text()); myClient->setPort(ui->portLed->text().toInt()); } void Widget::on_connectBtn_clicked() { init(); myClient->start(); } void Widget::on_sendDataBtn_clicked() { QByteArray data; _head.sop[0] = '@'; _head.sop[1] = '@'; _head.sop[2] = '&'; _head.sop[3] = '&'; _head.type = 1; _head.length = 4+4+4+300*8; dataSend = new double[3360000]; for(int i = 0;i<3360000;i++) { dataSend[i] = (double)i*0.01; } qDebug()<<data.size(); data.append((char*)&_head,sizeof(_head)); qDebug()<<data.size(); data.append((char*)dataSend,sizeof(dataSend)*3360000);//传数据 qDebug()<<data.size(); myClient->sendData(data);//发数据 } void Widget::on_sendStrBtn_clicked() { QByteArray str; _head.sop[0] = '@'; _head.sop[1] = '@'; _head.sop[2] = '&'; _head.sop[3] = '&'; _head.type = 2; _head.length = 4+2+2+8; QString sendStr = "hello world!"; QByteArray sendstr1 = sendStr.toLocal8Bit(); str.append((char*)&_head,sizeof(head)); qDebug()<<str; str.append(sendstr1); qDebug()<<str; myClient->sendData(str); } void Widget::on_pushButton_clicked() { double *num; num =new double[3360000]; for(int i = 0;i<3360000;i++) { num[i] = (double)i*0.0001; // ui->textBrowser->append(QString::number(num[i])); } // qDebug()<<num[335999]; // double num[3360000];//越界 // delete num; // delete []num; }
服务器部分
server.h
#ifndef SERVER_H #define SERVER_H #include <QTcpServer> #include <QTcpSocket> #include <QObject> class Server : public QObject { Q_OBJECT public: explicit Server(QObject *parent = nullptr); void init(); void start(); void setPort(quint16); signals: void sg_msg(QString,QByteArray); void sg_data(QString,QByteArray); void sg_size(int); public slots: void slot_newConnect(); void slot_readData(); //void slot_removedisconnect(); protected: bool findhead(QByteArray &buffer,int &index); void dealType1Data(const QString ip,QByteArray& array); void dealType2Data(const QString ip,QByteArray& array); private: QTcpServer *tcpserver; QTcpSocket *tcpsocket; QByteArray m_buffer; quint16 m_port; }; #endif // SERVER_H
#ifndef WIDGET_H #define WIDGET_H #include <QTcpSocket> #include <QTcpServer> #include <QWidget> #include "server.h" #include "datadefine.h" namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); void init1(); ~Widget(); protected: void slot_getData(QString,QByteArray); void slot_getMsg(QString, QByteArray); void slot_getSize(int); private: Ui::Widget *ui; Server *m_server; double *num; }; #endif // WIDGET_H
cpp部分:
#include "server.h" #include <QHostAddress> Server::Server(QObject *parent) : QObject(parent) { init(); } void Server::init() { tcpserver = new QTcpServer; connect(tcpserver,&QTcpServer::newConnection,this,&Server::slot_newConnect); } void Server::slot_newConnect() { tcpsocket = new QTcpSocket; tcpsocket = tcpserver->nextPendingConnection();//连接 QString ipstr = tcpsocket->peerAddress().toString(); quint16 port = tcpsocket->peerPort(); QString msg = QString("ip:%1port:%2 successfully connect!").arg(ipstr).arg(port); qDebug()<<msg<<ipstr<<port; connect(tcpsocket,&QTcpSocket::readyRead,this ,&Server::slot_readData); } void Server::start() { tcpserver->listen(QHostAddress::Any,m_port); } void Server::setPort(quint16 port) { m_port = port; qDebug()<<"port"<<m_port; } void Server::slot_readData() { QTcpSocket * tcpsocket = (QTcpSocket * ) sender(); QString ip = tcpsocket->peerAddress().toString(); quint16 port = tcpsocket->peerPort(); QString msg = QString("ip:%1 port:%2 successfully connect!").arg(ip).arg(port); QByteArray buffer = tcpsocket->readAll(); qDebug()<<"buffer data :"<<buffer<<endl; qDebug()<<"buffer size :"<<buffer.size()<<endl; int index = 0; m_buffer.append(buffer); emit sg_size(m_buffer.size()); // if(m_buffer.size() == 3360000*8+12) // { while(findhead(m_buffer,index)) {//清除缓存 //@@&&之前无效报文 m_buffer.remove(0,index); char* ptr = m_buffer.data(); quint32 length; memcpy(&length,ptr+4,sizeof(length)); // qDebug()<<"length:"<<length; if(length<m_buffer.size()) return; quint32 type; memcpy(&type,ptr+8,sizeof(type)); m_buffer.remove(0,12);//去除无效报文,将头和长度类型去掉 switch(type) { case 1:dealType1Data(ip,m_buffer);break; case 2:dealType2Data(ip,m_buffer);break; } m_buffer.remove(0,length-12); } } bool Server::findhead(QByteArray &buffer, int &index) { //qDebug()<<__FUNCTION__<<buffer; char * ptr = buffer.data(); for(int i = 0;i<buffer.size()-4;i++) { if(ptr[i] == '@' && ptr[i+1]== '@' && ptr[i+2] == '&' && ptr[i+3]=='&')//找到帧头 { index = i; return true; } } return false; } void Server::dealType1Data(const QString ip, QByteArray &array) { QByteArray arraybuffer; arraybuffer =array; qDebug()<<array.size(); double *num =new double[3360000]; memcpy(num,array.data(),3360000*8); //memcpy(num, array.data(),300*8); // for(int i=0;i<array.count();i++) // { // memcpy(num,array.data(),i); // } //memcpy(&num,arraybuffer.data(),sizeof(num)); // for(int i=0;i<300;i++) qDebug()<<"num:"<<num[335999]<<num[1]<<endl; emit sg_data(ip,floatData); } void Server::dealType2Data(const QString ip, QByteArray &array) { QByteArray msgData = array; // stringData.append(array); QString strMsg = msgData.data(); // memcpy(&strMsg,stringData.data(),sizeof(strMsg)); qDebug()<<"strMsg:"<<strMsg; emit sg_msg(ip,msgData); }
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); setWindowTitle("server"); m_server = new Server; init1(); ui->progressBar->setRange(0,3360000); connect(m_server,&Server::sg_size,this,&Widget::slot_getSize); } Widget::~Widget() { delete ui; delete[] num; } void Widget::init1() { m_server->setPort(888); connect(m_server,&Server::sg_data,this,&Widget::slot_getData); connect(m_server,&Server::sg_msg,this,&Widget::slot_getMsg); m_server->start(); } void Widget::slot_getData(QString ip, QByteArray getData) { QByteArray getDataRec; getDataRec.append(getData); num = new double[3360000]; memcpy((char*)&num,getDataRec,3360000*8); for(int i= 3359990;i<=3360000;i++) ui->textBrowser->append(QString::number(num[i])); qDebug()<<"ip:"<<ip; } void Widget::slot_getMsg(QString ip, QByteArray msgData) { QByteArray getMsgRec = msgData; QString showMsg = getMsgRec.data(); ui->label->setText(showMsg); } void Widget::slot_getSize(int j) { int num_size = j; ui->progressBar->setValue(num_size); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。