当前位置:   article > 正文

QT中基于TCPIP数据通信传输_qt tcpip

qt tcpip

客户端:
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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();
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
#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;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82

服务器部分
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
#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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
#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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/187355
推荐阅读
相关标签
  

闽ICP备14008679号