最近学习了QT的TCP通信,与大家分享下刚开始写TCP通信的一些经验。下面简单写了个TCP客户端的小例程。
基本步骤
- 新建一个工程,在.pro文件中添加
QT += network
- 在.h文件中添加头文件
#include <QTcpSocket>
- 在.h添加私有成员对象
QTcpSocket *tcpclient;
- cpp文件中实例化对象
tcpclient = new QTcpSocket(this);
- tcpclient接收到数据会触发readyRead信号,我们将此信号绑定对应的槽函数
connect(tcpclient,&QTcpSocket::readyRead,this,&MainWindow::tcpclientreaddata);
-
编辑ui界面
-
连接按钮槽函数
void MainWindow::on_psBt_connect_clicked()
{
//未连接状态 去链接
if(tcpclient->state() != QAbstractSocket::ConnectedState) {
//连接服务器
tcpclient->connectToHost(ui->lnEt_ip->text(),ui->lnEt_port->text().toUShort());
//等待连接成功
if(!tcpclient->waitForConnected(30000)) {
qDebug() << "Connection failed!";
return;
}
ui->psBt_connect->setText("已连接");
}
//已连接状态 去断开
else {
//断开服务器
tcpclient->disconnectFromHost();
ui->psBt_connect->setText("连接");
}
}
- 接收槽函数打印数据
void MainWindow::tcpclientreaddata()
{
QByteArray buffer = tcpclient->readAll();
QString recstr = QString(buffer);
ui->txEt_data->append("接收到数据:"+recstr);
qDebug()<<recstr;
}
- 发送数据槽函数
void MainWindow::on_psBt_send_clicked()
{
if(tcpclient->state() == QAbstractSocket::ConnectedState) {
//获取发送的数据
QString sendstr = ui->txEt_sendata->toPlainText();
//发送数据
tcpclient->write(sendstr.toLocal8Bit());
//打印发送的数据
ui->txEt_data->append("发送数据:"+sendstr);
}
}
完整代码
- mainwindow.h文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
public slots:
void tcpclientreaddata(void);
private slots:
void on_psBt_connect_clicked();
void on_psBt_send_clicked();
private:
Ui::MainWindow *ui;
QTcpSocket *tcpclient;
};
#endif // MAINWINDOW_H
- mainwindow.cpp文件:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
tcpclient = new QTcpSocket(this);
connect(tcpclient,&QTcpSocket::readyRead,this,&MainWindow::tcpclientreaddata);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::tcpclientreaddata()
{
QByteArray buffer = tcpclient->readAll();
//此处为解决单片机发来数据中中文乱码问题
QString recstr = QString::fromLocal8Bit(buffer);
ui->txEt_data->append("接收数据:"+recstr);
qDebug()<<recstr;
}
void MainWindow::on_psBt_connect_clicked()
{
//未连接状态 去链接
if(tcpclient->state() != QAbstractSocket::ConnectedState) {
//服务器IP
QString serverip = ui->lnEt_ip->text();
//服务器PORT
ushort serverport = ui->lnEt_port->text().toUShort();
//连接服务器
tcpclient->connectToHost(serverip,serverport);
//等待连接成功
if(!tcpclient->waitForConnected(30000)) {
qDebug() << "Connection failed!";
return;
}
ui->psBt_connect->setText("已连接");
}
//已连接状态 去断开
else {
//断开服务器
tcpclient->disconnectFromHost();
ui->psBt_connect->setText("连接");
}
}
void MainWindow::on_psBt_send_clicked()
{
if(tcpclient->state() == QAbstractSocket::ConnectedState) {
//获取发送的数据
QString sendstr = ui->txEt_sendata->toPlainText();
//发送数据
tcpclient->write(sendstr.toLocal8Bit());
//打印发送的数据
ui->txEt_data->append("发送数据:"+sendstr);
}
}
运行结果
代码下载地址工程文件