C/C++学习)22.QTcpServer、QTcpSocket、QUdpSocket使用
一、TCP/UDP通信在Qt中的实现过程:
废话不说,首先下面是Qt中TCP/UDP的实现图解:
1.Qt下TCP通信详解:
针对上图进行简单的说明:
QTcpServer用来创建服务器对象,服务器对象创建以后,调用成员函数listen()进行监听某个IP和某个端口,其中listen()包含了IP和Port(即地址和端口)。其实服务器的监听操作是用来将该服务器和某个地址以及某个端口绑定。你可以理解为Qt为了区分服务器和客户端而创造了监听操作。具体代码如下:
_server = new QTcpServer;
_server->listen(QHostAddress("127.0.0.1"), 9988);
当服务器对象创建完成,并进行了监听(绑定)后,服务器就一直在监听,而客户端用QTcpSocket创建与服务器进行通信的Tcp通信对象,使用成员函数connectToHost()进行发起连接操作,当服务器接收到连接请求完成三次握手之后,连接成功。而此时服务器的 QTcpServer 对象会触发一个 newConnection() 信号,而对该信号,我们加以处理,在其槽函数中取出建立连接后服务器端创建的用于通信的 QTcpSocket 对象(nextPendingConnection()返回这样一个对象)注意:此时服务器有两个对象,QTcpServer 和 QTcpSocket 对象,一个用来监听一个用来通信。连接成功之后,客户端也会触发一个connected()连接成功的信号。这样就可以开始进行数据传输。
当服务器的 QTcpSocket 对象和客户端的 QTcpSocket 对象进行数据交换时,发送方发送数据(write()),对端检测信号readyRead(),如果发送成功,则readyRead()信号就会被触发,此时我们只要在readyRead()信号的槽函数中实现数据的接受读取(read()、readAll()等)即可。
2、Qt Udp通信(QUdpSocket):
Udp比Tcp简单的多,因为服务器不需要进行监听,显得和客户端并无两样,只需要知道对端的IP和端口就能进行数据传输,但是却不保证一定能完成消息的抵达(这就是TCP与UDP的一个主要区别:TCP会粘包但是不会丢包,而UDP会丢包不会粘包),(我们会在测试中用同一段代码来测试客户端与服务器,因为对于单线程/进程来说其实就是没有区别)。其次,TCP与UDP的数据形式不同,所以UDP的数据接收成员函数,自然不能用TCP的简单的read、write(流式数据),而要使用readDatagram、writeDatagram。
二、TCP/UDP通信的代码测试
注意:在使用到TCP/UDP时,需要在工程文件 xxx.pro 中加上:”QT += network”
1.TCP 实现服务器端和客户端聊天(代码文件多不好贴上,如需要留言邮箱必回)
如上:服务器可以选择IP地址和端口绑定或连接(包括服务器自身和客户端),客户端可以绑定连接服务器(先服务器绑定再客户端连接)。
2.UDP实现各个用户之间聊天(代码文件多不好贴上,如需要留言邮箱必回)
文章部分引用自:https://blog.csdn.net/Apollon_krj/article/details/72857828
C/C++学习)22.QTcpServer、QTcpSocket、QUdpSocket使用的更多相关文章
- QT 使用QTcpServer QTcpSocket 建立TCP服务器端 和 客户端
1. 如图客户端连接server后,server发送"hello tcp" 给客户端 2. 实例代码 ----------------------------------- s ...
- Python学习--22 异步I/O
在同步IO中,线程启动一个IO操作然后就立即进入等待状态,直到IO操作完成后才醒来继续执行.而异步IO方式中,线程发送一个IO请求到内核,然后继续处理其他的事情,内核完成IO请求后,将会通知线程IO操 ...
- python学习(22) 访问数据库
原文链接:http://www.limerence2017.com/2018/01/11/python22/ 本文介绍python如何使用数据库方面的知识. SQLite SQLite是一种嵌入式数据 ...
- OpenCV学习(22) opencv中使用kmeans算法
kmeans算法的原理参考:http://www.cnblogs.com/mikewolf2002/p/3368118.html 下面学习一下opencv中kmeans函数的使用. 首先我们 ...
- [World Wind学习]22.相机高度和瓦片等级计算
在这里我们看到判断Lod的级别主要有三个条件: * 1.相机视角范围,视角范围越大,所包含的tileSize就越大 * 2.相机与瓦片距离,距离越远,所包含的tileSize也就越大 * 3.相机视锥 ...
- python学习22之函数式编程
'''''''''1.高阶函数:将函数作为参数传递到另一个函数中,作为这个函数的参数,这样的方式叫高阶函数(1)map:两个参数,一个是函数,一个是iterator,将函数依次作用于Iterator中 ...
- iOS 学习 - 22 异步解析 JSON,使用 FMDB 存储,TableView 显示
前提是已经知道了有哪些 key 值 Model 类: .h @interface ListModel : NSObject @property (nonatomic, copy)NSString *t ...
- 【Java EE 学习 22 下】【单线程下载】【单线程断点下载】【多线程下载】
一.文件下载简述 1.使用浏览器从网页上下载文件,Servlet需要增加一些响应头信息 (1)response.setContentType("application/force-downl ...
- 【Java EE 学习 22 上】【文件上传】【目录打散】【文件重命名】
1.文件上传概述 (1)使用<input type="file">的方式来声明一个文件域. (2)表单提交方式一定要是post方式才行 (3)表单属性enctype 默 ...
随机推荐
- [mac]WireShark检測不到网卡怎么办?
wireshark是一个很好用的抓包工具,有windows版本号和mac版本号,在mac下安装wireshark,启动后发现提示"There are no interfaces on whi ...
- GitHub上README.md教程(copy)
[说明:转载于http://blog.csdn.net/kaitiren/article/details/38513715] 最近对它的README.md文件颇为感兴趣.便写下这贴,帮助更多的还不会编 ...
- 【转载】Java - Wait & Notify
[本文转自]http://www.cnblogs.com/dolphin0520/p/3920385.html 这三个方法的文字描述可以知道以下几点信息: 1)wait().notify()和noti ...
- 清北刷题10.23night
NOIP 模拟赛 张若天 年 ⽉ ⽇ 题⽬名称 监听 实验室 ⽂明 可执⾏⽂件名 monitor lab civilization 输⼊⽂件名 monitor.in lab.in civilizati ...
- 数组去重----es6&es5&数组对象去重
es6方法: 普通数组: 1.使用Array.from(new Set(arr)); /* * @param oldArr 带有重复项的旧数组 * @param newArr 去除重复项之后的新数组 ...
- 怎样去思考问题 解决问题 zkc学长的福利
题目描述 又是一年ACM集训的时刻,zkc学长邀请n位同学来玩一个有奖游戏.首先,他让每个同学在左.右手上面分别写下一个整数,zkc学长自己也在左.右手上各写一个整数.然后,让这n位同学排成一排,zk ...
- NET 编程题
1.C#编写创建一个线程的代码 using System; using System.IO; using System.Threading ; class MyThread{ public int c ...
- ORA-01654_TableSpace空间不足问题处理
操作环境:Windows Server 2008 R2,32位Oracle11g R2. 导入大批量数据时报如下错误信息: ORA-: 索引IOT.IDX_IOT_EQUIP_ID无法通过1024(在 ...
- 笔记本 windows 10 安装
开机按快捷键是F12,选择从usb启动.秋叶系统 很好用,推荐使用. 联想笔记本u深度一键u盘启动BIOS设置教程:准备工作:制作好u深度u盘启动盘http://rj.baidu.com/soft/d ...
- Windows 7上安装Microsoft Loopback Adapter(微软环回网卡)
Oracle 安装过程中,先决条件检查遇到如下错误: 正在检查网络配置要求... 检查完成.此次检查的总体结果为: 失败 <<<< 问题: 安装检测到系统的主 IP 地址是 ...


