48.QT-网络通讯讲解1

网络概念算法

  • MAC地址(硬件地址)
  • 网络IP地址(如192.168.1.101)
  • 网络端口(实现多路通讯,用来给不一样应用程序来区分使用,范围0~65535,好比浏览网页服务(80端口), FTP服务(21端口) )

交换机和路由器编程

  • 路由器在网络层,路由器能够处理TCP/IP协议,交换机不能够.
  • 交换机在中继层。路由器根据IP地址寻址,交换机根据MAC地址寻址。
  • 路由器提供防火墙的服务,具备虚拟拨号上网功能,交换机不具有这些功能。

交换机安全

端到端转发,基于MAC地址实现不一样设备间的数据转发,转发速度快.服务器

路由器网络

根据实际数据路线转发,基于网络IP地址实现不一样网络间的数据转发多线程

静态路由异步

指网络管理员配置好的转发路径,可以直接肯定数据路线转发,大型和复杂的网络环境一般不宜采用静态路由,当连线一改变,则静态路由须要从新配置socket

动态路由函数

路由器根据算法自动地创建本身的路由表实现数据转发,因为须要路由器之间频繁地交换各自的路由表,从而安全保密性低.学习

 

网络协议

为数据交换而创建的规则、标准或约定的集合

协议栈

 

如上图所示,能够看到应用层的FTP协议是基于传输层的TCP协议来实现文件共享传输.而传输层的TCP协议则基于网络层的IP实现的

默认状况下FTP协议使用TCP端口中的 20和21这两个端口,其中20用于传输数据,21用于传输控制信息

 

TCP和UDP

TCP(传输控制协议)

面向链接的协议, 主要用于大量数据的场合,好比文件传输,一个TCP链接必需要通过3次握手才能创建

 

  1. 客户端向服务器请求发送信号
  2. 服务器接收到后,向客户端发送回应信号,并提供seq序列号(表示每一个数据包的编号,由于数据是被拆成多个数据包发送的).告诉客户端,你下个数据包序号从指定值开始
  3. 客户端再次发出ACK肯定服务器的发送ACK请求同步要求

而后握手完成后,便开始进行数据传输了.

为何要第3次握手,而不是2次握手?

避免重复链接请求,若是第一次链接请求超时了, 这时客户端假如重发请求,而第一次链接请求最终仍是发送到服务器了,则服务器将再次重复接受到该请求,因为服务器以前已经肯定过了第3次肯定请求,因此服务器能够直接抛弃无论了(假如没有第3次确认,则服务器没法避免重连)

一个TCP断连则须要4次挥手才能断开

 

1.客户端发送一个FIN,用来关闭客户到服务器的数据传送

2.服务器收到这个FIN,它发回一个ACK,确认序号为收到的seq序号加1。

3.服务器关闭与客户端的链接,发送一个FIN给客户端A

4.客户端发回ACK报文确认,并将确认序号设置为收到序号加1

UDP(用户数据报协议)

无链接的协议, 主要用于不要求分组顺序到达、少许数据的传输场合, 数据传输效率高.缺点容易掉包.

 

QT网络编程

Qt Network模块提供的类容许编写 TCP/IP clients 和 servers、以及FTP和HTTP等经常使用协议(后续章节讲解FTP和HTTP)

而QTcpSocket和QTcpServer类则是实现TCP客户端和服务器用的.

QTcpSocket

在网络编程中, QTcpSocket支持如下两种访问方式

1)异步(非阻塞)访问

异步方式经过QTcpSocket的信号与槽实现,好比当咱们调用connectToHost()链接服务器时,此时并不是当即链接成功,因此咱们须要等待connected()信号触发后,才知道链接成功,固然也能够经过信号error()来处理与服务器的链接发生错误的异常事件.

2) 同步(阻塞)访问

经过waitForXxxx()函数实现阻塞,最好使用多线程实现,不然的话,会致使界面也会进入阻塞.

QTcpSocket同步链接服务器步骤以下:

socket->connectToHost("192.168.1.101", 8088);         //链接服务器
if (socket->waitForConnected(1000))            //阻塞等待1000ms
      qDebug("Connected!");
else
      return false;
socket->write(data, len);                  //写数据
socket ->waitForBytesWritten();

socket->waitForReadyRead();          //等待读取数据
qDebug()<< "Received Bytes:" << socket->read(buf, sizeof(buf)-1);

socket ->disconnectFromHost();            //断开链接
socket ->waitForDisconnected(); 

 

未完待续,下章来学习客户端与服务器实例

相关文章
相关标签/搜索