Qt 学习笔记 - 第四章 - Qt的三驾马车之 - 网络编程
Qt 学习笔记全系列传送门:
1、TCP 通信
1.1 TCP 编程的特点
- 包含服务器和客户端
- 使用时需要在工程文件中引入
QT += network
并在使用时导入包 - 需要使用到的类有
- QTcpServer
- QTcpSocket
1.2 TCP 服务器案例
需要先定义并在构造中初始化
QTcpServer *tcpServer
和QTcpSocket *tcpSocket
:// 这里传入 this 时,父对象被删除时子对象也会被删除,省去了delete的麻烦
tcpServer = new QTcpServer(this);
tcpSocket = new QTcpSocket(this);
工程文件
QT += core gui network
UI
接收框,只读
端口号输入框和提示文字
发送窗口
按钮,打开服务器、关闭服务器、发送
控件改名
逻辑功能
监听:槽函数,点击打开服务器时,需要监听对应端口是否被访问
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this); // 新建tcpServer和tcpSocket的对象,成员属性在头文件中已定义,细节不表
tcpServer = new QTcpServer(this);
tcpSocket = new QTcpSocket(this);
} void Widget::on_openBt_clicked()
{
// 开启监听,监听所有人的连接,参数指定所有人和一个无符号整型端口
tcpServer->listen(QHostAddress::Any, ui->portEdit->text().toUInt());
}
接收:包含获取和展示两个部分
获取
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this); tcpServer = new QTcpServer(this);
tcpSocket = new QTcpSocket(this); // 当监测到新的连接产生的信号时,调用槽函数newConnection_Slot()
connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newConnection_Slot())); } void Widget::newConnection_Slot()
{
// 获取到已经连接的客户端的Socket
tcpSocket = tcpServer->nextPendingConnection(); // 当存在可读数据时,调用槽函数readyRead_Slot(),用于展示到接收框中
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_Slot())); }
展示到接收框
void Widget::readyRead_Slot()
{
// 读取tcpSocket中的内容,使用字符串接收
QString buf = tcpSocket->readAll(); // 将读取到的信息展示到接收框中
ui->recvEdit->appendPlainText(buf); }
发送
void Widget::on_sendBt_clicked()
{
// 需要转成 char*
tcpSocket->write(ui->sendEdit->text().toLocal8Bit().data());
}
关闭
void Widget::on_closeBt_clicked()
{
tcpServer->close();
tcpSocket->close();
}
1.3 TCP 客户端案例
工程文件
QT += core gui network
UI
接收框,只读
端口号输入框和提示文字、IP地址输入框和提示文字
发送窗口
按钮,打开服务器、关闭服务器、发送
控件改名
逻辑功能
需要先定义并在构造中初始化
QTcpSocket *tcpSocket
:
tcpSocket = new QTcpSocket(this);
连接
void Widget::on_openBt_clicked()
{
// 点击打开客户端时,应连接服务器,取界面上的ip和端口,端口要转Uint
tcpSocket->connectToHost(ui->ipEdit->text(), ui->portEdit->text().toUInt()); // 当监听到连接成功的信号connected()时,调用槽函数connected_Slot()
connect(tcpSocket, SIGNAL(connected()), this, SLOT(connected_Slot()));
}
接收
void Widget::connected_Slot()
{
// 当监听到有东西可读的信号readyRead()时,调用槽函数
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_Slot()));
} void Widget::readyRead_Slot()
{
// 读取tcpSocket中的信息,展示到页面上
ui->recvEdit->appendPlainText(tcpSocket->readAll());
}
发送
void Widget::on_sendBt_clicked()
{
// 发送时将发送框中的内容转为 char* 写入tcpSocket
tcpSocket->write(ui->sendEdit->text().toLocal8Bit());
}
关闭
void Widget::on_closeBt_clicked()
{
tcpSocket->close();
}
2、UDP 通信
1.1 UDP 编程的特点
不分客户端和服务器
使用时需要在工程文件中引入
QT += network
并在使用时导入包需要使用 QUdpSocket 类
1.2 UDP 客户端
需要先定义并在构造中初始化
QUdpSocket *udpSocket
:
udpSocket = new QUdpSocket(this);
工程文件
QT += core gui network
UI
- 接收框,只读
- 端口号输入框和提示文字、目标端口号输入框和提示文字、IP地址输入框和提示文字
- 发送窗口
- 按钮,打开服务器、关闭服务器、发送
- 控件改名
逻辑功能
启动
void Widget::on_openBt_clicked()
{
// 将端口号绑定到Socket
if (udpSocket->bind(ui->localPortEdit->text().toUInt())) {
QMessageBox::information(this, "提示", "成功");
} else {
QMessageBox::information(this, "提示", "失败");
}
// 关联readyRead信号,有可读信号调用槽函数
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(readyRead_slot()));
}
接收
void Widget::readyRead_slot()
{
// hasPendingDatagrams()用于判断是否读取完,若没有读完则返回true
while (udpSocket->hasPendingDatagrams()) {
QByteArray arr;
// 将数组调整为和 udpSocket 中剩下的数据大小一样
arr.resize(udpSocket->pendingDatagramSize());
// 将udpSocket中的信息读取到arr中,参数为接收数组和接收的数据长度
udpSocket->readDatagram(arr.data(), arr.size());
// 将信息写到页面上
QString buffer = arr.data();
ui->recvEdit->appendPlainText(buffer);
}
}
发送
void Widget::on_sendBt_clicked()
{
qunit16 port = ui->aimPortEdit->text().toUInt();
QString sendbuffer = ui->sendEdit->text();
QHostAddress addr;
addr.setAddress(ui->aimIpEdit->text()); // 发送的内容需要转成 char*
udpSocket->writeDatagram(sendbuffer.toLocal8Bit().data(), sendbuffer.length(), addr, port);
}
关闭
void Widget::on_closeBt_clicked()
{
udpSocket->close();
}
Qt 学习笔记 - 第四章 - Qt的三驾马车之 - 网络编程的更多相关文章
- Qt 学习笔记 - 第五章 - Qt 时间编程 - Qt 时钟
原文地址:Qt 学习笔记 - 第五章 - Qt 时间编程 - Qt 时钟 Qt 学习笔记全系列传送门: Qt 学习笔记 - 第一章 - 快速开始.信号与槽 Qt 学习笔记 - 第二章 - 添加图片.布 ...
- Qt 学习笔记 - 第三章 - Qt的三驾马车之一 - 串口编程 + 程序打包成Windows软件
Qt 学习笔记全系列传送门: Qt 学习笔记 - 第一章 - 快速开始.信号与槽 Qt 学习笔记 - 第二章 - 添加图片.布局.界面切换 [本章]Qt 学习笔记 - 第三章 - Qt的三驾马车之一 ...
- [Python学习笔记][第四章Python字符串]
2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...
- o'Reill的SVG精髓(第二版)学习笔记——第四章
第四章:基本形状 4.1线段 SVG可以使用<line>元素画出一条直线段.使用时只需要指定线段起止点的x和y坐标即可.指定坐标时可以不带单位,此时会使用用户坐标,也可以带上单位,如em. ...
- MFC/QT 学习笔记(四)——MFC基于对话框学习控件(上)
新建项目->MFC模板->MFC应用程序->应用程序类型:基于对话框->...OK 解决方案资源管理器->资源文件->xxx.rc->进入:资源视图-> ...
- MFC/QT 学习笔记(四)——MFC基于对话框学习控件(下)
//5.列表控件 ListControl 属性 报表模式 view:Report:添加变量 //Cdemo5Dlg.cpp ps:资源视图 右键 类向导 成员变量 查看对象所属类 // TODO: 在 ...
- Java 学习笔记 ------第四章 认识对象
本章学习目标: 区分基本类型与类类型 了解对象与参考的关系 从打包器认识对象 以对象观点看待数组 认识字符串的特性 一."=" 和 "==" 当=用于基本类型时 ...
- 《metasploit渗透测试魔鬼训练营》学习笔记第四章—web应用渗透
继续来学习metasploit...记好笔记是很重要的,下面开始正文: 二.WEB应用渗透技术 1.WEB应用渗透基础知识 先介绍WEB应用攻击的主要类型(大致介绍,具体请自行查 ...
- c语言学习笔记第四章——字符串和格式化输入、输出
B站有视频演示 本章学习printf函数的输入输出,字符串的定义与实用. 字符串 字符串(character string)是一个或多个字符的序列,如下所示: "Zing went the ...
- [core java学习笔记][第四章对象与类]
4.3 用户自定义类 4.3.1 类数组的声明 需要两次new Employee[]=staff=new Employedd[3]; staff[0]=new Employedd(参数列表); sta ...
随机推荐
- NASM中的内存引用
NASM对于内存的引用规则非常简单,如果想访问内存中的内容,就将地址用[]包围,如果没有[],就表示是地址本身,而不是内容. mov ax,[wordvar] mov ax,[wordvar+1] m ...
- 小程序中 canvas 的图片不支持 base64 格式
首先使用 wx.base64ToArrayBuffer 将 base64 数据转换为 ArrayBuffer 数据,使用FileSystemManager.writeFile 将 ArrayBuffe ...
- SpringBoot3集成WebSocket
标签:WebSocket,Session,Postman. 一.简介 WebSocket通过一个TCP连接在客户端和服务器之间建立一个全双工.双向的通信通道,使得客户端和服务器之间的数据交换变得更加简 ...
- 京东面试:如何进行JVM调优?
JVM 调优是一个很大的话题,在回答"如何进行 JVM 调优?"之前,首先我们要回答一个更为关键的问题,那就是,我们为什么要进行 JVM 调优? 只有知道了为什么要进行 JVM 调 ...
- Biwen.Settings添加对IConfiguration&IOptions的集成支持
Biwen.Settings 是一个简易的配置项管理模块,主要的作用就是可以校验并持久化配置项,比如将自己的配置存储到数据库中,JSON文件中等 使用上也是很简单,只需要在服务中注入配置即可, 比如我 ...
- HTML——form表单
表单主要是用来收集客户端提供的相关信息,提供了用户数据录入的方式,有多选.单选.单行文本.下拉列表等输入框,便于网站管理员收集用户的数据,是Web浏览器和Web服务器之间实现信息交流和数据传递的桥梁. ...
- itest work(爱测试) 开源一站式接口测试&敏捷测试工作站 9.0.5. Rc4
(一)itest work 简介 itest work (爱测试) 一站式工作站让测试变得简单.敏捷,"好用.好看,好敏捷" ,是itest wrok 追求的目标.itest w ...
- Visual Studio编程效率提升技巧集(提高.NET编程效率)
前言 本文大姚将为你介绍一些Visual Studio的使用技巧和建议,旨在帮助.NET开发者更加高效地利用Visual Studio进行编程工作.无论你是.NET初学者还是经验丰富的.NET开发者, ...
- 如果设备不支持vulkan,就用swiftshader,否则就加载系统的vulkan的正确姿势(让程序能够智能的在vulkan-1.dll和libvk_swiftshader.dll之间切换)
一些老的显卡设备没有更新驱动,甚至根本就不支持Vulkan的显卡,遇到静态链接的vulkan-1.lib文件,启动exe就会崩溃. 你以为从别的机器拷贝这个vulkan-1.dll就可以了吗? 太傻太 ...
- 剑指Offer-58.对称的二叉树(C++/Java)
题目: 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 分析: 从根结点开始递归对比左右子树即可.需要注意的是,当前左右两个结点相同比较 ...