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 默 ...
随机推荐
- 用js采集网页数据并插入数据库最快的方法
今天教大家一个快速采集网站数据的方法,因为太晚了,直接上例子,这里以采集易车网的产品数据为例. 思路:利用js获取网页数据并生成sql命令,执行sql命令把采集的数据插入数据库. 1.用谷歌浏览器或者 ...
- Hibernate - Query简易
package cn.demo; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; im ...
- Flask的多app应用,多线程如何体现
一.多app应用 在一个py文件中创建多个Flask的app对象 from werkzeug.wsgi import DispatcherMiddleware from werkzeug.servin ...
- Mysql中分页查询两个方法比较
mysql中分页查询有两种方式, 一种是使用COUNT(*)的方式,具体代码如下 1 2 3 SELECT COUNT(*) FROM foo WHERE b = 1; SELECT a FROM ...
- JSP共享范围
概念:对象的声明周期和可访问性称为作用域(scope). 注:有时候内置对象的作用域一旦设置就不能修改,其他对象(如JavaBean)可以设置他的作用域 作用域类型: Page:页面域(对象只对于它所 ...
- CentOS下网卡启动、配置等ifcfg-eth0教程
步骤1.配置/etc/sysconfig/network-scripts/ifcfg-eth0 里的文件. CentOS6.4 下的ifcfg-eth0的配置详情: [root@Jeffery]# v ...
- E20180124-hm
introspection n.自我反省; 反省,内省; capacity n. 容量; 性能; 才能; 生产能力; synthesize vt. 综合; 人工合成; (通过化学手段或生物过程) 合成 ...
- bzoj 1045: [HAOI2008] 糖果传递【瞎搞】
感觉我的智商可能不够写题解,就直接截了hzwer的blog 地址http://hzwer.com/2656.html #include<iostream> #include<cstd ...
- codeforces 402E - Strictly Positive Matrix【tarjan】
首先认识一下01邻接矩阵k次幂的意义:经过k条边(x,y)之间的路径条数 所以可以把矩阵当成邻接矩阵,全是>0的话意味着两两之间都能相连,也就是整个都要在一个强连通分量里,所以直接tarjan染 ...
- noip2002矩阵覆盖(搜索)
矩阵覆盖 题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见 ...


