Qt网络通信服务端与客户端学习

一、项目概述

本项目基于Qt框架实现了TCP服务端与客户端的基本通信,涵盖连接、消息收发、断开管理等功能,适合初学者系统学习Qt网络模块的实际用法。

二、项目结构

  • 52/ 服务端:main.cpp、widget.cpp、widget.h
  • 53/ 客户端:main.cpp、widget.cpp、widget.h

三、环境配置

  • Qt 5.x及以上
  • 启用network、widgets模块
  • C++11支持

四、服务端核心代码详解(52目录)

1. main.cpp

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

2. widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{Q_OBJECT
public:Widget(QWidget *parent = nullptr);~Widget();
private:Ui::Widget *ui;           // UI指针QTcpServer *tcpServer;    // TCP服务端对象
private slots:void mNewConnetion();     // 新连接处理槽void receiveMessages();   // 接收消息槽void mStateChanged(QAbstractSocket::SocketState); // 连接状态变化槽void on_pushButton_3_clicked(); // 发送消息按钮槽void on_pushButton_clicked();   // 开始监听按钮槽void on_pushButton_2_clicked(); // 停止监听按钮槽
};
#endif // WIDGET_H

3. widget.cpp

#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);tcpServer = new QTcpServer(this);this->setWindowTitle("服务端");connect(tcpServer, SIGNAL(newConnection()), this, SLOT(mNewConnetion()));ui->pushButton_2->setEnabled(false);
}
Widget::~Widget()
{delete ui;
}
void Widget::mNewConnetion()
{QTcpSocket *tmpTcpSocket = tcpServer->nextPendingConnection();QString ipaddr = tmpTcpSocket->peerAddress().toString();quint16 port = tmpTcpSocket->peerPort();ui->textBrowser->append("服务端:客户端的ip地址:" + ipaddr);ui->textBrowser->append("服务端:客户端的端口:" + QString::number(port));connect(tmpTcpSocket, SIGNAL(readyRead()), this, SLOT(receiveMessages()));connect(tmpTcpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)),this, SLOT(mStateChanged(QAbstractSocket::SocketState)));
}
void Widget::receiveMessages()
{QTcpSocket *tmpTcpSocket = (QTcpSocket *)sender();ui->textBrowser->append("客户端:" + tmpTcpSocket->readAll());
}
void Widget::mStateChanged(QAbstractSocket::SocketState state)
{QTcpSocket *tmpTcpSocket = (QTcpSocket *)sender();switch (state) {case QAbstractSocket::UnconnectedState:ui->textBrowser->append("服务端:客户端断开连接");tmpTcpSocket->deleteLater();break;case QAbstractSocket::ConnectedState:ui->textBrowser->append("服务端:客户端已连接");break;default:break;}
}
void Widget::on_pushButton_3_clicked()
{QList <QTcpSocket *> socketList = tcpServer->findChildren<QTcpSocket *>();qDebug() << "tcpSocket 数量:" << socketList.count() << endl;if (socketList.count() == 0) {ui->textBrowser->append("当前没有客户端连接,请先与客户端连接!");return;}foreach (QTcpSocket *tmpTcpSocket, socketList) {tmpTcpSocket->write(ui->lineEdit->text().toUtf8());}ui->textBrowser->append("服务端:" + ui->lineEdit->text());
}
void Widget::on_pushButton_clicked()
{tcpServer->listen(QHostAddress("192.168.1.59"), 9999);ui->textBrowser->append("服务端:监听的ip地址和端口:192.168.1.59,9999");ui->pushButton_2->setEnabled(true);ui->pushButton->setEnabled(false);
}
void Widget::on_pushButton_2_clicked()
{tcpServer->close();ui->pushButton->setEnabled(true);ui->pushButton_2->setEnabled(false);
}

五、客户端核心代码详解(53目录)

1. main.cpp

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

2. widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTcpSocket>
#include <QHostAddress>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{Q_OBJECT
public:Widget(QWidget *parent = nullptr);~Widget();
private:Ui::Widget *ui;           // UI指针QTcpSocket *tcpSocket;    // TCP客户端对象
private slots:void receiveMessages();   // 接收消息槽void mStateChanged(QAbstractSocket::SocketState); // 连接状态变化槽void on_pushButton_3_clicked(); // 发送消息按钮槽void on_pushButton_clicked();   // 连接服务端按钮槽void on_pushButton_2_clicked(); // 断开连接按钮槽
};
#endif // WIDGET_H

3. widget.cpp

#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("客户端");ui->pushButton_2->setEnabled(false);tcpSocket = new QTcpSocket(this);connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(receiveMessages()));connect(tcpSocket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(mStateChanged(QAbstractSocket::SocketState)));
}
Widget::~Widget()
{delete ui;
}
void Widget::receiveMessages()
{ui->textBrowser->append("服务端:" + tcpSocket->readAll());
}
void Widget::mStateChanged(QAbstractSocket::SocketState state)
{switch (state) {case QAbstractSocket::UnconnectedState:ui->textBrowser->append("客户端:与服务端断开连接");ui->pushButton->setEnabled(true);ui->pushButton_2->setEnabled(false);break;case QAbstractSocket::ConnectedState:ui->textBrowser->append("客户端:已连接服务端");ui->pushButton->setEnabled(false);ui->pushButton_2->setEnabled(true);break;default:break;}
}
void Widget::on_pushButton_3_clicked()
{if (tcpSocket->state() == QAbstractSocket::ConnectedState) {tcpSocket->write(ui->lineEdit->text().toUtf8());ui->textBrowser->append("客户端:" + ui->lineEdit->text());} elseui->textBrowser->append("请先与服务端连接!");
}
void Widget::on_pushButton_clicked()
{ui->textBrowser->append("客户端:监听的ip地址和端口:192.168.1.59,9999");tcpSocket->connectToHost(QHostAddress("192.168.1.59"), 9999);
}
void Widget::on_pushButton_2_clicked()
{tcpSocket->disconnectFromHost();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95979.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95979.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/95979.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神马 M60S++ 238T矿机参数解析:高效SHA-256算法比拼

1. 算法与适用币种神马 M60S 238T采用SHA-256算法&#xff0c;适用于挖掘主流的加密货币&#xff0c;包括比特币&#xff08;BTC&#xff09;和比特币现金&#xff08;BCH&#xff09;。SHA-256&#xff08;安全哈希算法256位&#xff09;是一种广泛应用于比特币等加密货币挖矿…

[特殊字符] 深入理解操作系统核心特性:从并发到分布式,从单核到多核的全面解析

&#x1f680; 深入理解操作系统核心特性&#xff1a;从并发到分布式&#xff0c;从单核到多核的全面解析&#x1f4a1; 前言&#xff1a;操作系统是计算机的灵魂&#xff0c;它就像一个优秀的管家&#xff0c;协调着硬件和软件之间的关系。今天&#xff0c;我们将深入探讨操作…

人工智能机器学习——聚类

一、无监督学习(Unsupervised Learning)机器学习的一种方法&#xff0c;没有给定事先标记过的训练示例&#xff0c;自动对输入的数据进行分类或分群。优点&#xff1a; 算法不受监督信息&#xff08;偏见&#xff09;的约束&#xff0c;可能考虑到新的信息不需要标签数据&#…

优化MySQL分区表备份流程详解

在大型数据驱动应用中&#xff0c;MySQL分区表是优化查询和维护历史的常见选择。但随之而来的数据备份问题却让许多开发者头疼&#xff1a;如何确保分散在不同分区的数据能完整、一致地被备份&#xff0c;并在需要时快速恢复&#xff1f;手动处理不仅繁琐&#xff0c;而且极易出…

用 Go + HTML 实现 OpenHarmony 投屏(hdckit-go + WebSocket + Canvas 实战)

本文带你用 Go HTML/WebSocket 从零实现一个 OpenHarmony 设备投屏 Demo&#xff1a;Go 侧用 hdckit-go 连接设备并抓取屏幕帧&#xff08;UiDriver&#xff09;&#xff0c;通过 WebSocket 二进制实时推送到浏览器&#xff0c;前端用 Canvas 渲染&#xff0c;并根据设备分辨率…

运筹学——求解线性规划的单纯形法

单纯形法的原理 先来举个例子&#xff1a; 用单纯形法求解下面线性规划问题的最优解&#xff1a;注释&#xff1a;解的过程是反复迭代的过程&#xff0c;如果第一次迭代没有理解也没关系&#xff0c;再继续看第二次迭代&#xff0c;和第三次迭代&#xff0c;每次迭代的流程都是…

Python GUI 框架 -- DearPyGui 简易入门

DearPyGui 关于 DPG 是一个简单且功能强大的 Python 图形用户界面框架。 与其他Python图形用户界面库相比&#xff0c;DPG具有以下独特之处&#xff1a; GPU 渲染多线程高度可定制内置开发人员工具&#xff1a;主题检查、资源检查、运行时指标带有数百种小部件组合的 70 多…

gcloud cli 使用 impersonate模拟 服务帐号

什么是模拟服务帐号 众所周知&#xff0c; gcloud 登陆的方式有两种 使用个人帐号&#xff0c; 通常是1个邮箱地址使用一个service account 通常是1个 json key 文件 所谓模式服务帐号意思就是&#xff0c; 让操作人员用个人帐号登陆&#xff0c; 但是登陆后所有的操作都是基于…

idf--esp32的看门狗menuconfig

1.Interrupt Watchdog Timeout (ms)&#xff1a;意思是中断看门狗&#xff0c;也就是专门监管中断响应时间的看门狗&#xff0c;如果某个中断服务程序超过了这个运行时间&#xff0c;就会导致程序重启。2.红框是任务看门狗的最大看门时间&#xff0c;超过时间就会警告&#xff…

git在Linux中的使用

git-Linux中的使用一、下载git二、https方式上传三、ssh秘钥方式上传一、下载git 版本信息 [rootrocky ~]# cat /etc/rocky-release Rocky Linux release 9.4 (Blue Onyx) [rootrocky ~]# cat /etc/rocky-release-upstream Derived from Red Hat Enterprise Linux 9.4 [rootro…

HMI(人机界面)

新晋码农一枚&#xff0c;小编定期整理一些写的比较好的代码&#xff0c;作为自己的学习笔记&#xff0c;会试着做一下批注和补充&#xff0c;转载或者参考他人文献会标明出处&#xff0c;非商用&#xff0c;如有侵权会删改&#xff01;欢迎大家斧正和讨论&#xff01;一、核心…

嵌入式解谜日志—多路I/O复用

多路 I/O复用&#xff08;Multiplexed I/O&#xff09;&#xff1a;1.定义&#xff1a;系统提供的I/O事件通知机制2.应用&#xff1a;是一种 I/O 编程模型&#xff0c;用于在单线程中同时处理多个&#xff08;阻塞&#xff09; I/O 操作&#xff0c;避免因等待某个 I/O 操作完成…

关于嵌入式学习——单片机4

ds18b20温度传感器的使用一、传感器分类&#xff1a;数字温度传感器&#xff0c;实现简单&#xff0c;不需要额外转换电路&#xff0c;采集过来的就是数字温度值模拟温度传感器->热敏电阻->AD转换电路->数字值二、传感器接口&#xff1a;GPIO接口&#xff1a;&#xf…

Kali搭建sqli-labs靶场

1.输入apt-get install docker.io即可下载靶场镜像。 下载好后&#xff0c;我们输入docker search sqli-labs搜索sqli-labs靶场。2.我们选择第一个&#xff0c;输入docker pull acgpiano/sqli-labs&#xff0c;将该靶场装到本地。此时输入docker images&#xff0c;发现本地有s…

电脑外接显示屏字体和图标过大

当外接显示屏的分辨率过高时&#xff0c;可以调整显示器设置来解决字体和图标过大的问题。具体操作包括在桌面右击选择显示设置&#xff0c;切换到外接显示器&#xff0c;将分辨率调至推荐的1920x1080&#xff0c;或根据个人偏好进行适当调节&#xff0c;然后保存更改。 原因&a…

Linux 网络流量监控 Shell 脚本详解(支持邮件告警)

前言 一、脚本功能 二、实现原理 三、Shell 脚本实现 四、关键知识点解析 1. Bash 关联数组 2. 命令组 { } 与子 Shell ( ) 3. 字符串拼接换行 4. 流量计算逻辑 五、测试方法 六、优化建议 七、总结 前言 在生产环境中&#xff0c;监控服务器的 网络流量 非常重要…

【牛客刷题-剑指Offer】BM18 二维数组中的查找:一题四解,从暴力到最优

文章目录 一、题目介绍 1.1 描述 1.2 示例1 1.3 示例2 1.4 给的部分代码 二、题解 方法一:暴力遍历 方法二:二分查找(逐行) 方法三:Z字形查找(最优解) 方法四:递归分治(拓展思路) 三、总结 心得体会 一、题目介绍 原题链接:https://www.nowcoder.com/practice/abc3…

使用pyspark对上百亿行的hive表生成稀疏向量

背景&#xff1a;一张上百亿行的hive表&#xff0c;只有id和app两列&#xff0c;其中app的去重量是8w多个&#xff08;原app有上百万枚举值&#xff0c;此处已经用id数量进行过筛选&#xff0c;只留下有一定规模的app&#xff09;&#xff0c;id的去重量大概有八九亿&#xff0…

【设计模式】关于学习《重学Java设计模式》的一些成长笔记

【设计模式】关于学习《重学Java设计模式》的一些成长笔记 没有几个人是一说就会的,掌握一些技能,不仅要用心,而且还需要从温故中知新。 为此,好记性不如烂笔头,我干脆一步一脚印地系统学习一遍设计模式! (关注不迷路哈!!!) 文章目录 【设计模式】关于学习《重学Jav…

【基础-判断】@Entry装饰的自定义组件将作为页面的入口。在单个页面中可以使用多个@Entry装饰不同自定义组件。

@Entry装饰的自定义组件将作为页面的入口。在单个页面中可以使用多个@Entry装饰不同自定义组件。 解释: @Entry 的核心作用与唯一性:@Entry 装饰器用于明确声明该组件是一个页面的入口组件,即整个页面的“根”和“起点”。当UIAbility实例加载并显示页面时,系统需要明确知道…