当前位置: 首页 > article >正文

Qt的Tcp通信

Tcp通信

  • 1、前言
  • 2 、客户端
    • 2.1创建客户端ui界面
    • 2.2在.pro文件中添加network
    • 2.3定义一个通信对象并创建socket对象
    • 2.4socket连接成功,会发出信号
    • 2.5socket连接失败,发出信号
    • 2.6创建取消按钮的信号与槽
    • 2.7创建连接按钮的信号与槽
    • 2.8 .h文件和.cpp文件
      • 2.8.1 .h文件
      • 2.8.2 .cpp文件
  • 3、服务器
    • 3.1创建服务器ui界面
    • 3.2在.pro文件中添加network
    • 3.3定义一个服务器对象并创建server对象
    • 3.4监听连接对象
    • 3.5客户端发起连接时,server会发出信号
    • 3.6创建处理有新客户端连接时的槽函数
    • 3.7 .h文件和.cpp文件
      • 3.7.1 .h文件
      • 3.7.2 .cpp文件
  • 4、总结

1、前言

前言:记录一下自己对于Qt中Tcp的学习,方便别人参考,也可以巩固自己的学习或者让

自己日后回顾。

2 、客户端

2.1创建客户端ui界面

在这里插入图片描述

2.2在.pro文件中添加network

先在.pro文件中添加network

在这里插入图片描述

2.3定义一个通信对象并创建socket对象

private:
    Ui::Widget *ui;
    QTcpSocket *socket;    //定义一个网络通信对象
 socket = new QTcpSocket(this);  //创建socket对象

2.4socket连接成功,会发出信号

    //连接服务器成功,socket会发出一个信号
    connect(socket, &QTcpSocket::connected,this,[=](){
        QMessageBox::information(this,"连接提示","连接服务器成功");
    });

2.5socket连接失败,发出信号

    //连接断开
    connect(socket, &QTcpSocket::disconnected,this,[=](){
        QMessageBox::warning(this,"连接提示","连接异常");
    });

2.6创建取消按钮的信号与槽

在这里插入图片描述

//取消按钮
void Widget::on_canclePushButton_clicked()
{
    this->close();      //关闭窗口
}

2.7创建连接按钮的信号与槽

与上面类似
//连接按钮
void Widget::on_connectPushButton_clicked()
{
    //1.获取ip地址和端口号
    QString ip = ui->ipLineEdit->text();
    QString port = ui->potrLineEdit->text();

    qDebug() << ip;
    qDebug() << port;



    //连接服务器
    socket->connectToHost(QHostAddress(ip),port.toShort());

}

2.8 .h文件和.cpp文件

2.8.1 .h文件

.h文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpSocket>
#include <QHostAddress>
#include <QMessageBox>
#include <QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_canclePushButton_clicked();         //取消按钮

    void on_connectPushButton_clicked();        //连接按钮

private:
    Ui::Widget *ui;
    QTcpSocket *socket;    //定义一个网络通信对象
};
#endif // WIDGET_H

2.8.2 .cpp文件

.cpp文件

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    socket = new QTcpSocket(this);  //创建socket对象

    //连接服务器成功,socket会发出一个信号
    connect(socket, &QTcpSocket::connected,this,[=](){
        QMessageBox::information(this,"连接提示","连接服务器成功");
    });

    //连接断开
    connect(socket, &QTcpSocket::disconnected,this,[=](){
        QMessageBox::warning(this,"连接提示","连接异常");
    });

}

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


//取消按钮
void Widget::on_canclePushButton_clicked()
{
    this->close();      //关闭窗口
}

//连接按钮
void Widget::on_connectPushButton_clicked()
{
    //1.获取ip地址和端口号
    QString ip = ui->ipLineEdit->text();
    QString port = ui->potrLineEdit->text();

    qDebug() << ip;
    qDebug() << port;



    //连接服务器
    socket->connectToHost(QHostAddress(ip),port.toShort());

}

3、服务器

3.1创建服务器ui界面

在这里插入图片描述

3.2在.pro文件中添加network

在这里插入图片描述

3.3定义一个服务器对象并创建server对象

private:
    Ui::Widget *ui;
    QTcpServer *server;       //定义服务器
server = new QTcpServer(this);      //创建服务器对象

3.4监听连接对象

server->listen(QHostAddress::AnyIPv4,port);         //监听来自任何IPv4地址的连接请求

3.5客户端发起连接时,server会发出信号

//客户端发起连接,server发出信号
connect(server,&QTcpServer::newConnection,this, &Widget::newClientHandler);

3.6创建处理有新客户端连接时的槽函数

private slots:
    void newClientHandler();          //处理新客户端连接
//处理新客户端连接
void Widget::newClientHandler()
{
    //建立Tcp连接
    QTcpSocket *socket = server->nextPendingConnection();

//    socket->peerAddress();      //获取客户端地址
//    socket->peerPort();         //获取客户端端口号

    ui->ipLineEdit->setText(socket->peerAddress().toString());              //显示地址
    ui->portLineEdit->setText(QString::number(socket->peerPort()));         //显示端口号
}

3.7 .h文件和.cpp文件

3.7.1 .h文件

.h文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>

#define port 8000

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void newClientHandler();          //处理新客户端连接

private:
    Ui::Widget *ui;
    QTcpServer *server;       //定义服务器
};
#endif // WIDGET_H

3.7.2 .cpp文件

.cpp文件

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    server = new QTcpServer(this);      //创建服务器对象

    server->listen(QHostAddress::AnyIPv4,port);         //监听来自任何IPv4地址的连接请求

    //客户端发起连接,server发出信号
    connect(server,&QTcpServer::newConnection,this, &Widget::newClientHandler);
}

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

//处理新客户端连接
void Widget::newClientHandler()
{
    //建立Tcp连接
    QTcpSocket *socket = server->nextPendingConnection();

//    socket->peerAddress();      //获取客户端地址
//    socket->peerPort();         //获取客户端端口号

    ui->ipLineEdit->setText(socket->peerAddress().toString());              //显示地址
    ui->portLineEdit->setText(QString::number(socket->peerPort()));         //显示端口号
}

4、总结

总结:以上就是Qt的Tcp通信的整个过程了,浏览过程中,如若发现错误,欢迎大家指正,

有问题的可以评论区留言或者私信。 最后,如果大家觉得有所帮助的话,可以点个赞,

谢谢大家!永远相信美好的事情即将发生!
Qt的Tcp通信完成!

http://www.kler.cn/a/582027.html

相关文章:

  • mysql的MGR
  • 基于生成式人工智能的网络安全主动防御技术(下)
  • C++ 编程基础:注释、字符串、输入输出、日期处理、修饰符
  • 2025最新软件测试面试八股文(含答案+文档)
  • CSS伸缩盒模型(弹性盒子)
  • 01 音视频知识学习(视频)
  • 写一个简单的SQL生成工具
  • 算法刷题--贪心算法
  • Sentinel-1 InSAR ISCE数据处理:stackSentinel.py 完全指南
  • python LLM工具包
  • API调试工具的无解困境:白名单、动态IP与平台设计问题
  • Faster R-CNN原理详解以及Pytorch实现模型训练与推理
  • Spring Boot 整合 RabbitMQ(在Spring项目中使用RabbitMQ)
  • Chrome 浏览器 134 版本新特性
  • 一周学会Flask3 Python Web开发-SQLAlchemy连接Mysql数据库
  • Html5-照片滤镜应用学习经验总结
  • Windows10下docker desktop命令行操作指南(大部分也适用于Linux)
  • Jmeter请求发送加密参数
  • K8S学习之基础二十三:k8s的持久化存储之nfs
  • 机器学习 Day02,matplotlib库绘图