Qt实现TcpClient和TcpServer连接收发数据
2017-09-25 15:02
417 查看
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
发送指令设计:
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!!!");
}
首先在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!!!");
}
相关文章推荐
- C# TCP/IP 连接实现数据收发 Demo (Visual Studio)
- Qt 实现TcpServer与TcpClient
- Qt与Java实现Tcp网络通信,收发简单字符串。
- JDK7 AIO (非阻塞IO)实现大并发TCPServer和TCPClient
- select连接TCPIP数据收发测试(连接多客户)
- QT TcpServer模型搭建及实现
- 基于QTcpSocket和QTcpServer的Tcp通讯以及QDataStream序列化数据
- hadoop单线程实现server多socket连接读取数据原理分析
- Go语言练习 TCPserver 与 TCPclient实现
- Qt中利用TCP实现客户端与服务器端的数据传输
- TCP实现内网连接到外网,外网发送数据给内网的例子
- vc socket api建立TCP连接(包括域名解析)并收发数据的代码模板
- Android简单实现Socket通信,client连接server后,server向client发送文字数据
- Qt中利用TCP实现客户端与服务器端的数据传输
- hadoop单线程实现server多socket连接读取数据原理分析
- java用ServerSocket类结合io流实现一对一聊天(java实现简单的TCP聊天程序只能用telnet连接后方可使用)
- TCP建立连接结束过程,client与server数据传输
- GCDAsyncSocket实现TCP连接怎么设置发送数据延时
- select连接TCPIP数据收发测试
- TCPServer 和 TCPClient的实现