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!!!");
}