Qt實現TcpClient和TcpServer連接收發數據

Qt實現TcpClient和TcpServer連接收發數據,TcpClent實現上位機給串口發送指令,沒有什麼問題了,可是讓下位機做出相應的指令。

首先在TcpClient和TcpServer中的pro加入QT+=network。

界面設計:

接受指令設計:

tcpclient.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QWidget>
#include <QMainWindow>
#include <QDialog>
#include <QAbstractSocket>
class QTcpSocket;
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QTcpSocket *tcpSocket;
    QString currentForture;
    quint16 blockSize;
private slots:
    void newConnect();
    void readMessage();
    void displayError(QAbstractSocket::SocketError);

    //void on_connectButton_clicked();
    void on_connectpushButton_clicked();
};

#endif // MAINWINDOW_H

tcpclient.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork>
#include <QTimer>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    tcpSocket=new QTcpSocket();
    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readMessage()));
    connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(displayError(QAbstractSocket::SocketError)));

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::newConnect()
{
    //初始化數據大小信息爲0
    blockSize=0;
    //取消已有的連接
    tcpSocket->abort();
    //tcpSocket->connectToHost(ui->hostlineEdit->text(),ui->portlineEdit_2->text().toInt());
    tcpSocket->connectToHost(QHostAddress::LocalHost,4196);
}

void MainWindow::readMessage()
{
    QByteArray block;
    QDataStream in(tcpSocket);
    //QDataStream out(&block,QIODevice::ReadWrite);
    //設置數據流版本
    in.setVersion(QDataStream::Qt_5_6);
    //out.setVersion(QDataStream::Qt_5_6);

    //如果是剛開始接受數據
    if(blockSize==0)
    {
        if(tcpSocket->bytesAvailable()<(int)sizeof(quint16))
        {
            //將接收到的數據存放在變量中
            in>>blockSize;
        }
        if(tcpSocket->bytesAvailable()<blockSize)
            return;
        QString nextFortune;
        in>>nextFortune;
        if(nextFortune==currentForture)
        {
            QTimer::singleShot(0,this,&MainWindow::newConnect);
            return;
        }
        currentForture=nextFortune;

        //顯示接收到的數據
        qDebug()<<currentForture;
        ui->messagelabel->setText(currentForture);
    }

}

void MainWindow::displayError(QAbstractSocket::SocketError)
{
    qDebug()<<tcpSocket->errorString();
}

//連接按鈕
void MainWindow::on_connectpushButton_clicked()
{
    newConnect();
}


發送指令設計:

server.h

#ifndef SERVER_H
#define SERVER_H

#include <QMainWindow>
#include <QDialog>
class QTcpServer;

namespace Ui {
class server;
}

class server : public QMainWindow
{
    Q_OBJECT

public:
    explicit server(QWidget *parent = 0);
    ~server();

private:
    Ui::server *ui;
    QTcpServer *tcpServer;
private slots:
    void sendMessage();
};

#endif // SERVER_H


server.cpp

#include "server.h"
#include "ui_server.h"
#include <QtNetwork>
server::server(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::server)
{
    //QHostAddress &address="10.20.15.101";
    ui->setupUi(this);
    tcpServer=new QTcpServer(this);
    if(!tcpServer->listen(QHostAddress::LocalHost,4196))
    {
        qDebug()<<"錯誤"<<tcpServer->errorString();
        close();
    }
    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(sendMessage()));
}

server::~server()
{
    delete ui;
}

void server::sendMessage()
{
    QByteArray block;
    QDataStream out(&block,QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_5_6);
    out<<(quint16)0;
    out<<tr("hello Tcp!");
    out.device()->seek(0);
    out<<(quint16)(block.size()-sizeof(quint16));
    //獲取已經建立的連接的套接字
    QTcpSocket *clientConnection=tcpServer->nextPendingConnection();
    connect(clientConnection,SIGNAL(disconnected()),clientConnection,
            SLOT(deleteLater()));
    clientConnection->write(block);
    clientConnection->disconnectFromHost();
    //發送數據
    ui->label->setText("send message successful!!!");
}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章