QT网络编程之实现TCP客户端和服务端

推荐一个不错的人工智能学习网站,通俗易懂,内容全面,作为入门科普和学习提升都不错,分享一下给大家:前言icon-default.png?t=N7T8https://www.captainbed.cn/ai

一.QT5.12实现TCP客户端和服务功能

1.QT中实现TCP通信主要用到了以下类:QTcpServer、QTcpSocket、QHostAddress

2.基本流程:

使用QTcpServer来创建一个TCP服务器,在新的连接建立时,将新建立连接的socket添加到列表中,以便发送数据,同时监听在指定的IP地址和端口上,并在有新的客户端连接上来时进行处理;

使用QTcpSocket来创建一个TCP客户端,连接到服务器并发送数据;

二.代码示例

1.mainwindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QMainWindow>

#include    <QTcpServer>

#include    <QLabel>

namespace Ui {

class MainWindow;

}

class MainWindow : public QMainWindow

{

    Q_OBJECT

private:

    QLabel  *LabListen;//状态栏标签

    QLabel  *LabSocketState;//状态栏标签

    QTcpServer *tcpServer; //TCP服务器

    QTcpSocket *tcpSocket;//TCP通讯的Socket

    QString getLocalIP();//获取本机IP地址

protected:

    void    closeEvent(QCloseEvent *event);

public:

    explicit MainWindow(QWidget *parent = 0);

    ~MainWindow();

private slots:

//自定义槽函数

    void    onNewConnection();//QTcpServer的newConnection()信号

    void    onSocketStateChange(QAbstractSocket::SocketState socketState);

    void    onClientConnected(); //Client Socket connected

    void    onClientDisconnected();//Client Socket disconnected

    void    onSocketReadyRead();//读取socket传入的数据

//UI生成的

    void on_actStart_triggered();

    void on_actStop_triggered();

    void on_actClear_triggered();

    void on_btnSend_clicked();

    void on_actHostInfo_triggered();

private:

    Ui::MainWindow *ui;

};

#endif // MAINWINDOW_H

2.mainwindow.cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include    <QtNetwork>

QString MainWindow::getLocalIP()

{//获取本机IPv4地址

    QString hostName=QHostInfo::localHostName();//本地主机名

    QHostInfo   hostInfo=QHostInfo::fromName(hostName);

    QString   localIP="";

    QList<QHostAddress> addList=hostInfo.addresses();//

    if (!addList.isEmpty())

    for (int i=0;i<addList.count();i++)

    {

        QHostAddress aHost=addList.at(i);

        if (QAbstractSocket::IPv4Protocol==aHost.protocol())

        {

            localIP=aHost.toString();

            break;

        }

    }

    return localIP;

}

void MainWindow::closeEvent(QCloseEvent *event)

{//关闭窗口时停止监听

    if (tcpServer->isListening())

        tcpServer->close();;//停止网络监听

    event->accept();

}

MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    LabListen=new QLabel("监听状态:");

    LabListen->setMinimumWidth(150);

    ui->statusBar->addWidget(LabListen);

    LabSocketState=new QLabel("Socket状态:");//

    LabSocketState->setMinimumWidth(200);

    ui->statusBar->addWidget(LabSocketState);

    QString localIP=getLocalIP();//本机IP

    this->setWindowTitle(this->windowTitle()+"----本机IP:"+localIP);

    ui->comboIP->addItem(localIP);

    tcpServer=new QTcpServer(this);

    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(onNewConnection()));

}

MainWindow::~MainWindow()

{

    delete ui;

}

void MainWindow::onNewConnection()

{

//    ui->plainTextEdit->appendPlainText("有新连接");

    tcpSocket = tcpServer->nextPendingConnection(); //创建socket

    connect(tcpSocket, SIGNAL(connected()),

            this, SLOT(onClientConnected()));

    onClientConnected();//

    connect(tcpSocket, SIGNAL(disconnected()),

            this, SLOT(onClientDisconnected()));

    connect(tcpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),

            this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));

    onSocketStateChange(tcpSocket->state());

    connect(tcpSocket,SIGNAL(readyRead()),

            this,SLOT(onSocketReadyRead()));

}

void MainWindow::onSocketStateChange(QAbstractSocket::SocketState socketState)

{//socket状态变化时

    switch(socketState)

    {

    case QAbstractSocket::UnconnectedState:

        LabSocketState->setText("scoket状态:UnconnectedState");

        break;

    case QAbstractSocket::HostLookupState:

        LabSocketState->setText("scoket状态:HostLookupState");

        break;

    case QAbstractSocket::ConnectingState:

        LabSocketState->setText("scoket状态:ConnectingState");

        break;

    case QAbstractSocket::ConnectedState:

        LabSocketState->setText("scoket状态:ConnectedState");

        break;

    case QAbstractSocket::BoundState:

        LabSocketState->setText("scoket状态:BoundState");

        break;

    case QAbstractSocket::ClosingState:

        LabSocketState->setText("scoket状态:ClosingState");

        break;

    case QAbstractSocket::ListeningState:

        LabSocketState->setText("scoket状态:ListeningState");

    }

}

void MainWindow::onClientConnected()

{//客户端接入时

    ui->plainTextEdit->appendPlainText("**client socket connected");

    ui->plainTextEdit->appendPlainText("**peer address:"+

                                   tcpSocket->peerAddress().toString());

    ui->plainTextEdit->appendPlainText("**peer port:"+

                                   QString::number(tcpSocket->peerPort()));

}

void MainWindow::onClientDisconnected()

{//客户端断开连接时

    ui->plainTextEdit->appendPlainText("**client socket disconnected");

    tcpSocket->deleteLater();

    //    deleteLater();//QObject::deleteLater();

}

void MainWindow::onSocketReadyRead()

{//读取缓冲区行文本

//    QStringList   lines;

    while(tcpSocket->canReadLine())

        ui->plainTextEdit->appendPlainText("[in] "+tcpSocket->readLine());

//        lines.append(clientConnection->readLine());

}

void MainWindow::on_actStart_triggered()

{//开始监听

    QString     IP=ui->comboIP->currentText();//IP地址

    quint16     port=ui->spinPort->value();//端口

    QHostAddress    addr(IP);

    tcpServer->listen(addr,port);//

    ui->plainTextEdit->appendPlainText("**开始监听...");

    ui->plainTextEdit->appendPlainText("**服务器地址:"

                       +tcpServer->serverAddress().toString());

    ui->plainTextEdit->appendPlainText("**服务器端口:"

                       +QString::number(tcpServer->serverPort()));

    ui->actStart->setEnabled(false);

    ui->actStop->setEnabled(true);

    LabListen->setText("监听状态:正在监听");

}

void MainWindow::on_actStop_triggered()

{//停止监听

    if (tcpServer->isListening()) //tcpServer正在监听

    {

        tcpServer->close();//停止监听

        ui->actStart->setEnabled(true);

        ui->actStop->setEnabled(false);

        LabListen->setText("监听状态:已停止监听");

    }

}

void MainWindow::on_actClear_triggered()

{

    ui->plainTextEdit->clear();

}

void MainWindow::on_btnSend_clicked()

{//发送一行字符串,以换行符结束

    QString  msg=ui->editMsg->text();

    ui->plainTextEdit->appendPlainText("[out] "+msg);

    ui->editMsg->clear();

    ui->editMsg->setFocus();

    QByteArray  str=msg.toUtf8();

    str.append('\n');//添加一个换行符

    tcpSocket->write(str);

}

void MainWindow::on_actHostInfo_triggered()

{//获取本机地址

    QString hostName=QHostInfo::localHostName();//本地主机名

    ui->plainTextEdit->appendPlainText("本机主机名:"+hostName+"\n");

    QHostInfo   hostInfo=QHostInfo::fromName(hostName);

    QList<QHostAddress> addList=hostInfo.addresses();//

    if (!addList.isEmpty())

    for (int i=0;i<addList.count();i++)

    {

        QHostAddress aHost=addList.at(i);

        if (QAbstractSocket::IPv4Protocol==aHost.protocol())

        {

            QString IP=aHost.toString();

            ui->plainTextEdit->appendPlainText("本机IP地址:"+aHost.toString());

            if (ui->comboIP->findText(IP)<0)

                ui->comboIP->addItem(IP);

        }

    }

}

三.测试结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/461102.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

weblogic CVE-2023-21839详细复现

1、本次复现使用vulhub的靶场 切换到靶场的目录下&#xff0c;用docker -compose up -d启动靶场 使用docker-compose ps -a查看靶场的端口 2、访问开启的环境 3、准备工作都做好之后开始复现 &#xff08;1&#xff09;开启JNDIExploit 工具地址&#xff1a;GitHub - WhiteH…

拌合楼内部管理系统开发(一)立个flag,开始做准备

前言&#xff1a;项目背景情况介绍 公司有意开发一套适合拌合楼的内部管理系统给到客户使用&#xff0c;接触过一家拌合楼行业内号称标杆的企业&#xff0c;去过参观学习的都觉得他们软件好用&#xff0c;但是从软件开发角度看&#xff0c;就是crud钉钉机器人无人值守。虽然公司…

开源绘图工具 PlantUML 入门教程(常用于画类图、用例图、时序图等)

文章目录 一、类图二、用例图三、时序图 一、类图 类的UML图示 startuml skinparam classAttributeIconSize 0 class Dummy {-field1 : String#field2 : int~method1() : Stringmethod2() : void } enduml定义能见度&#xff08;可访问性&#xff09; startumlclass Dummy {-f…

基于ssm+layui的图书管理系统

基于ssmlayui的图书管理系统 账户类型分为&#xff1a;管理员&#xff0c;用户管理员私有功能用户私有功能公共功能技术栈功能实现图 视频演示 账户类型分为&#xff1a;管理员&#xff0c;用户 图书管理系统主要登录账户类型为管理员账户与用户账户 管理员私有功能 账户管理…

如何压缩图片文件大小?教大家几种方法

当图片文件较大时&#xff0c;图片压缩可以有效的缩小图片kb&#xff0c;从而使图片储存起来更加方便&#xff0c;也可以解决上传时图片大小被限制的问题&#xff0c;那么我们有什么方法可以简单快速的将图片大小压缩呢&#xff1f;下面就来给大家分享几个如何修改照片大小kb的…

VS2022开发上位机流程

1、生成串口调试助手的主要控件 2、生成串口对象 3、书写代码 3.1 串口的选择 跳转到图形化界面&#xff0c;然后双击空白位置&#xff0c;会自动生成From1_Load,此函数的作用是会更新串口的选择&#xff0c;然后加入代码&#xff0c;combox控件就可以识别串口 /* 新增自定义…

windows系统版本是win11 运行程序显示windows版本是win10,

在Windows 11系统中运行程序时显示的Windows版本是Windows 10&#xff0c;这种现象可能是由以下几个原因导致的&#xff1a; 程序兼容性问题&#xff1a; 某些程序可能尚未更新以识别Windows 11操作系统&#xff0c;因此它们仍然报告系统为Windows 10。程序读取的是遗留的系统信…

机器学习-04-分类算法-02贝叶斯算法

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中分类算法&#xff0c;本篇为分类算法与贝叶斯算法部分。 本门课程的目标 完成一个特定行业的算法应用全过程&#xff1a; 懂业务会选择合适的算法数据处理算法训练算法调优算法融合 算法评估持续调优工程…

Linux服务器(RedHat、CentOS系)安全相关巡检shell脚本

提示&#xff1a;巡检脚本可以使用crontab定时执行&#xff0c;人工根据执行结束时间点统一收集报告文件即可。 #!/bin/bash# Define output file current_date$(date "%Y%m%d") # Gets the current date in YYYYMMDD format echo >server_security_inspection_r…

【C++ RB树】

文章目录 红黑树红黑树的概念红黑树的性质红黑树节点的定义红黑树的插入代码实现总结 红黑树 AVL树是一颗绝对平衡的二叉搜索树&#xff0c;要求每个节点的左右高度差的绝对值不超过1&#xff0c;这样保证查询时的高效时间复杂度O( l o g 2 N ) log_2 N) log2​N)&#xff0c;…

openwrt下部署clouddrive2

在启动项上增加启动参数 在exit 0前面增加 mount --make-shared /mnt/data480g注意&#xff0c;后面的/mnt/data480g要替换成你设置的共享映射券。 拉取镜像 docker pull cloudnas/clouddrive2启动镜像 一定要用ssh在后台用docker run命令启动&#xff0c;因为openwrt前台…

Windows 安装配置 RabbitMQ 详解

目录 1、安装前准备2、安装Erlang2.1 安装2.2 配置环境变量 3、安装RabbitMQ3.1 安装3.2 配置环境变量3.3 安装rabbitmq_management插件3.4 启动RabbitMQ服务 4、常用命令 本文将详说如何在Windows系统中安装RabbitMQ。 1、安装前准备 因为RabbitMQ服务器是用Erlang语言编写的…

AQY214S固态继电器:用于控制各种应用中的模拟信号的紧凑解决方案

AQY214S是一款多功能固态继电器&#xff0c;是一款经过精心设计的精致固态继电器&#xff0c;可在多种应用中与低电平模拟信号共舞。在这次探索中&#xff0c;我们将揭开AQY214S的复杂性&#xff0c;重点介绍其独特的功能&#xff0c;并深入研究其在不同行业中的应用的迷人挂毯…

MySQL MHA故障切换

目录 一、案例分析 1.1、案例概述 1.2、案例前置知识点 1&#xff09;什么是 MHA 2&#xff09;MHA 的组成 3&#xff09;MHA 的优势 4&#xff09;MHA 现状 1.3、案例环境 1&#xff09;本案例环境 ​编辑 2&#xff09;案例需求 3&#xff09;案例实现思路…

基于springboot的七彩云南文化旅游网站的设计与实现(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装七彩云南文化旅游网站软件来发挥其高效地信息处理的作用&am…

web学习笔记(三十三)

目录 1.严格模式 1.1严格模式的概念&#xff1a; 1.2严格模式在语义上更改的地方&#xff1a; 1.3如何开启严格模式 1.4严格模式应用上的变化 2.原型链 1.严格模式 1.1严格模式的概念&#xff1a; 严格模式有点像es5向es6过渡而产生的一种模式&#xff0c;因为es6的语法…

蓝桥杯决赛2023 RE CyberChef2

思路很清晰&#xff0c;爆IV 但是题目出的有点屎&#xff0c;六位字符串&#xff0c;62的6次方&#xff0c;要我爆到猴年马月&#xff1f; 就当练习脚本吧 #Cyber2 wp from Crypto.Cipher import DES, AES from Crypto.Util.Padding import pad, unpad key_des b0a0b0c0…

从零开始利用MATLAB进行FPGA设计(三)将Simulink模型转化为定点数据类型

文章灵感来源于MATLAB官方免费教程&#xff1a;HDL Coder Self-Guided Tutorial 考虑到MATLAB官网的英文看着慢&#xff0c;再加上视频讲解老印浓浓的咖喱味&#xff0c;我决定记录利用MATLAB&Simulink&SystemGenerator进行FPGA数字信号处理的学习过程。 往期回顾&am…

【Miniconda】Linux系统中 .condarc 配置文件的位置一般在哪里

【Miniconda】Linux系统中 .condarc 配置文件的位置一般在哪里 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Span)

作为Text组件的子组件&#xff0c;用于显示行内文本的组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 该组件从API Version 10开始支持继承父组件Text的属性&#xff0c;即如果子组件未设置…