Qt TCP实现简单通信功能

 更新时间:2022年08月22日 09:41:26   作者:xundao_803817  
这篇文章主要为大家详细介绍了Qt TCP实现简单通信功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Qt TCP实现简单通信的具体代码,供大家参考,具体内容如下

在.pro文件中添加网络模块 Qt += network

服务端:

1. 创建QTcpServer 对象,用于监听,创建套接字等;

QTcpServer * serverSocket = new QTcpServer(this);

2.进行监听,通过QTcpServer对象 QTcpServer::listen();

bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);

例子:

// 获取单行输入框输入的数为端口号
short port = ui->lineEdit->text().toInt();
tcpServer->listen(QHostAddress::Any, port); // QHostAddress::Any表示自动绑定

3.使用信号槽,connect(), 判断是否有客户端来连接,QTcpServer::newConnection();

[signal] void QTcpServer::newConnection()

例子:

// 3.基于 QTcpServer::newConnection() 信号检测是否有新客户端连接
connect(tcpServer, &QTcpServer::newConnection, this, [=]()
    {
        // 创建用于通信的套接字
        // 4.如果有新的客户端连接调用 QTcpSocket* QTcpServer::nextPendingConnection()
        // 在通信编辑框中显示成功与客户端取得连接
        // 5.准备与客户端通信
        // 6.判断客户端是否断开连接    
    });

4.在步骤3的基础上,创建套接字,QTcpSocket socketServer = QTcpServer::nextPendingConnection();

5.在步骤3的基础上,使用信号槽connect(),判断是否接收客户端发了 的信息QTcpSocket::readyRead();

6. 在步骤5的基础上,通过套接字调用readAll() ,读取客户端发来的信息;

7.在步骤3的基础上,通过套接字判断客户端是否下线,关闭套接字;

客户端:

1. 创建套接字对象,用于通信 QTcpSocket *clientSocket = new QTcpSocket(this);

2. 调用信号槽,connect() ,判断是否成功连接服务端connected;

3. 调用信号槽,connect() , 判断是否接受来着服务端发来的信息 readyRead();

4. 在步骤3的基础上,利用套接字对象调用readAll() 方法,读取服务端发来的消息;

5. 利用套接字调用write() 方法,将消息发送给服务端;

6. 调用信号槽,connect() , 判断是否断开连接,释放套接字;

服务端代码:

MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
 
#include "QDebug"
#include <QMessageBox>
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    // 设置窗口名称
    setWindowTitle(QString("Server-TCP"));
    setWindowIcon(QIcon(QPixmap("D:\\BaiduNetdiskDownload\\Res WWW\\picture\\ico\\01_副本.png")));
 
    // 刚进来是将连接状态图片置成灰色的
    m_pixmap.load(QString("D:\\BaiduNetdiskDownload\\Res WWW\\picture\\ico\\01_副本_副本.png"));
 
    // 2.socket 通信
    //tcpSocket = new QTcpSocket();
    // 获取套接字
    // 服务端通信流程
    // 1.创建套接字服务器 QTcpServer对象
    tcpServer = new QTcpServer(this);
    // 2.通过QTcpServer对象设置监听,即QTcpServer::listen()
    // 3.基于 QTcpServer::newConnection() 信号检测是否有新客户端连接
    connect(tcpServer, &QTcpServer::newConnection, this, [=]()
    {
        // 成功连接则切换图片颜色
        m_pixmap.load(QString("D:\\BaiduNetdiskDownload\\Res WWW\\picture\\ico\\01_副本.png"));
 
        // 创建用于通信的套接字
        // 4.如果有新的客户端连接调用 QTcpSocket* QTcpServer::nextPendingConnection()
        tcpSocket = tcpServer->nextPendingConnection();
        // 在通信编辑框中显示成功与客户端取得连接
        ui->textEdit->append("成功与客户端取得连接!!!");
        // 5.准备与客户端通信
        connect(tcpSocket, &QTcpSocket::readyRead, this, [=]()
        {
            // 调用套接字读取客户端发的数据
            QString acceptText = tcpSocket->readAll(); // QByteArray 可以强制转成 QString
            // 将读取到的数据写到通信编辑框中
            ui->textEdit->append("客户端say:" + acceptText);
        });
 
        // 6.判断客户端是否断开连接
        connect(tcpSocket, &QTcpSocket::disconnected, this, [=]()
        {
            //QMessageBox(, QMessageBox::Warning, );
            QMessageBox::warning(this, "连接状态", "客户端已断开连接");
            tcpSocket->deleteLater();
            // 将连接状态图片置成灰色的
            m_pixmap.load(QString("D:\\BaiduNetdiskDownload\\Res WWW\\picture\\ico\\01_副本_副本.png"));
 
            //tcpServer->deleteLater();
        });
 
    });
 
    // 1.状态栏显示信息
    showMessageStatusBar();
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
// 状态栏添加提示信息
void MainWindow::showMessageStatusBar()
{
    // 设置窗口名称
    //QWidget::windowTitleChanged("Server-TCP");
    //ui->statusBar->setWindowTitle();
 
    // 通过加载QLable给状态栏显示文本
    QLabel *pLable = new QLabel();
    QLabel *lableText = new QLabel(QString::fromUtf8("连接状态:"));
 
    //lableText->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
    //pLable->setMinimumWidth(this->width()/2);
 
    //= new QLabel(QString::fromUtf8("连接状态:"));
    // 设置lable标签的大小
    //pLable->setMinimumSize(pLable->sizeHint());
    pLable->setFixedSize(30, 30);
 
    m_pixmap.scaled(pLable->width(), pLable->height());
    // 显示图片
    pLable->setPixmap(m_pixmap);
    // 按比例缩小图片
 
    //pLable->setFixedSize(QSize(50,50));
    // 设置状态栏样式
    //ui->statusBar->setStyleSheet(QString("QString::item{border:0px"));  // 不显示边框
    // 将标签加入到状态栏中
    ui->statusBar->addWidget(lableText);
    ui->statusBar->addPermanentWidget(pLable);//
}
 
// 处理点击启动服务器,进行监听
void MainWindow::on_pushButton_clicked()
{
    //qDebug() << "点击了 启动服务器按钮\n";
    // 获取输入框输入的数为端口号
    short port = ui->lineEdit->text().toInt();
    tcpServer->listen(QHostAddress::Any, port);
}
 
// 将数据发生给客户端
void MainWindow::on_pushButton_2_clicked()
{
    // 将发送数据编辑栏的文本通过套接字发生给客户端
    tcpSocket->write(ui->textEdit_2->toPlainText().toUtf8());
    // 需要将要发生的数据写到通信编辑栏中
    ui->textEdit->append("服务端say:" + ui->textEdit_2->toPlainText().toUtf8());
    // 清空发送消息编辑框
    ui->textEdit_2->clear();
}

mainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
 
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
    // 在状态栏中设置文本+图标
    void showMessageStatusBar();
 
    QTcpServer* tcpServer;
    QTcpSocket* tcpSocket;
 
private slots:
    void on_pushButton_clicked();
 
    void on_pushButton_2_clicked();
 
private:
    Ui::MainWindow *ui;
    // 用于加载图片路径
    QPixmap m_pixmap;
};
 
#endif // MAINWINDOW_H

程序UI

客户端:

client.cpp

#include "client.h"
#include "ui_client.h"
 
Client::Client(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Client)
{
    ui->setupUi(this);
 
    // 通信流程
    //1、创建套接字对象
    clientSocket = new QTcpSocket(this);
    //2、调用QTcpSocket::connectToHost() 绑定服务端IP和端口
 
    //3、通过套接字与服务端进行通信 收发
    // 判断是否成功连接服务端 开始读取服务端发来的信息
    connect(clientSocket, &QTcpSocket::readyRead, this, [=]()
    {
        // 通过套接字读取发来的信息
        QByteArray receiveAll = clientSocket->readAll();
        // 将获取到的信息显示到通信编辑栏中
        ui->textEdit_Record->append("服务端say:" + receiveAll);
    });
 
    // 开始的时候断开连接按钮置成不可用状态
    ui->disConBtn->setEnabled(false);
 
    // 判断是否连接成功
    connect(clientSocket, &QTcpSocket::connected, this, [=]()
    {
        // 将成功连接显示到通信记录编辑栏中
        ui->textEdit_Record->append("成功与服务端取得连接!!!");
        // 将断开连接置成可用状态
        ui->disConBtn->setEnabled(true);
    });
 
    // 判断是否断开连接
    connect(clientSocket, &QTcpSocket::disconnected, this, [=]()
    {
        // 将服务端断开连接显示到通信编辑框中
        ui->textEdit_Record->append("注意服务端已断开连接!!!");
        // 将连接服务端按钮置成不可用状态
        ui->conBtn->setEnabled(false);
    });
 
}
 
Client::~Client()
{
    delete ui;
}
 
// 点击按钮连接服务器,绑定地址与端口
void Client::on_conBtn_clicked()
{
    // 获取编辑框中的ip和端口
    unsigned short port = ui->lineEdit_port->text().toUShort();
    QString addr = ui->lineEdit_add->text();
    clientSocket->connectToHost(addr, port);
    // 需要将按钮置成不可用状态
    ui->conBtn->setEnabled(false);
}
 
// 断开连接
void Client::on_disConBtn_clicked()
{
    //clientSocket->disconnected();
    // 关闭套接字
    clientSocket->close();
    // 将客户端断开连接提示显示到通信编辑框中
    ui->textEdit_Record->append("注意客户端已断开连接!!!");
    // 将连接服务端按钮置成可用状态
    ui->conBtn->setEnabled(true);
}
 
// 点击按钮发送数据
void Client::on_sendBtn_clicked()
{
    // 获取发送信息编辑框的文本
    //ui->textEdit_Send->toPlainText().toUtf8();
 
    // 将获取到的信息发送给服务端
    clientSocket->write(ui->textEdit_Send->toPlainText().toUtf8());
    // 将发送的信息显示到通信记录编辑框中
    ui->textEdit_Record->append(ui->textEdit_Send->toPlainText().toUtf8());
    // 需要将发送编辑框清空缓存
    ui->textEdit_Send->clear();
}

client.h

#ifndef CLIENT_H
#define CLIENT_H
 
#include <QMainWindow>
#include <QTcpSocket>
 
namespace Ui {
class Client;
}
 
class Client : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit Client(QWidget *parent = nullptr);
    ~Client();
 
private slots:
    void on_conBtn_clicked();
 
    void on_disConBtn_clicked();
 
    void on_sendBtn_clicked();
 
private:
    Ui::Client *ui;
 
    // 创建套接字
    QTcpSocket * clientSocket;
};
 
#endif // CLIENT_H

程序UI

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C++运算符重载规则详解

    C++运算符重载规则详解

    这篇文章主要介绍了C++运算符重载规则详解,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C语言数据结构之扩展字符详解

    C语言数据结构之扩展字符详解

    掌握C语言数据结构的关键在于理解其核心概念,扩展字符作为其中的重要一环,对于编程人员来说至关重要,本指南将为您深入剖析扩展字符的相关知识,带您轻松掌握C语言数据结构,让我们一起探索这个令人着迷的领域吧!
    2024-03-03
  • Qt中QZXing 的编译与使用

    Qt中QZXing 的编译与使用

    本文主要介绍了Qt中QZXing 的编译与使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Linux中使用C语言实现基于UDP协议的Socket通信示例

    Linux中使用C语言实现基于UDP协议的Socket通信示例

    这篇文章主要介绍了Linux中使用C语言实现基于UDP协议的socket通信示例,服务器端与客户端的功能都非常基础,需要的朋友可以参考下
    2016-03-03
  • C++控制台绘图头文件实例代码

    C++控制台绘图头文件实例代码

    控制台(console)是电脑的最基本交互接口,通常包括键盘(keyboard)和屏幕(screen),下面这篇文章主要给大家介绍了关于C++控制台绘图头文件的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • 如何用C++实现A*寻路算法

    如何用C++实现A*寻路算法

    寻路是游戏比较重要的一个组成部分。因为不仅AI还有很多地方(例如RTS游戏里操控人物点到地图某个点,然后人物自动寻路走过去)都需要用到自动寻路的功能。本文将介绍一个经常被使用且效率理想的寻路方法-A*寻路算法,并且提供额外的优化思路
    2021-06-06
  • C++实现多线程并发场景下的同步方法

    C++实现多线程并发场景下的同步方法

    在C++中实现多线程并发场景下的同步方法,包括使用互斥锁、独占锁、共享锁和原子操作的实现,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • C++实现停车场管理系统的示例代码

    C++实现停车场管理系统的示例代码

    停车场管理系统就是模拟停车场进行车辆管理的系统,该系统分为汽车信息模块,用户使用模块和管理员用户模块,本文将用C++实现这一简单的系统,希望对大家有所帮助
    2023-04-04
  • C++ opencv图像处理实现图片边缘检测示例

    C++ opencv图像处理实现图片边缘检测示例

    这篇文章主要为大家介绍了C++ opencv实现图片边缘检测示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • C++实现LeetCode(67.二进制数相加)

    C++实现LeetCode(67.二进制数相加)

    这篇文章主要介绍了C++实现LeetCode(67.二进制数相加),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07

最新评论