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 默 ...
随机推荐
- 【OI】线性筛
如何查找一个范围内的所有素数? 可以是从1~n挨个判断n%i 是否 == 0,也可以从 1~sqr(n) 一个个判断. 相信你们也听说过埃氏筛法,是使用每一个数的倍数筛掉合数!但是!每一个合数要被筛多 ...
- ios24--改变button的文字和图片
// // ViewController.m // 09-UIButton内部子控件的调整 // // Created by xiaomage on 15/12/30. // Copyright © ...
- oracle type类型
转载 http://blog.sina.com.cn/s/blog_6cfb6b090100ve92.html 转自网络,具体用法我会再细化 1.概念 方法:是在对象类型说明中用关键字 MEM ...
- 详解jQuery uploadify文件上传插件的使用方法
uploadify这个插件是基于js里面的jquery库写的.结合了ajax和flash,实现了这个多线程上传的功能. 现在最新版为3.2.1. 在线实例 实例中用到的php文件UploaderDem ...
- Maven 项目管理 —— 安装与配置
Maven 是一种全新的项目构建方式,基于项目对象模型(POM,Project Object Model)的思想,Maven 可以管理项目的整个生命周期,包括编译.构建(build).测试.发布以及报 ...
- 【BZOJ 3211&3038】 花神游历各国 & 上帝造题的七分钟2
[题目链接] [BZOJ 3211] 点击打开链接 [BZOJ 3038] 点击打开链接 [算法] 线段树 开根操作直接开到叶子节点,注意当区间中所有数都是0或1时,不需要开根 [代码] #inclu ...
- 模块化编程:AMD规范
目前,通行的Javascript模块规范共有两种:ComonJS和AMD. CommonJS node.js的模块系统,就是参照CommonJS规范实现的.在ConmonJS中,有一个全局方法requ ...
- CodeForces 382C Arithmetic Progression (排序+分类讨论)
题意:给出一个长度为n的序列,表示有n张卡片,上面的数字,现在还有一张卡片,上面没有数字,问说可以写几种数字在这张卡片上面, 使得n+1张卡片上的数字可以排列成一个等差数列,有无限多种时输出-1. 析 ...
- 国王游戏 2012年NOIP全国联赛提高组(贪心+高精)
P1080 国王游戏 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成 ...
- redis实际项目作用
我整理一下redis主要在项目作用,只是我接触到的 1 手机验证码存入redis中,可以限制什么时候有效 2 防止接口请求频率过高,例如一分钟只能请求5次 代码如下: <?php /** * ...