第十八章 网络编程——Qt

1.网络访问接口

(1)HTTP(HyperText Transfer Protocol,超文本传输协议)

是一个客户端和服务器端之间进行请求和应答的标准。通常由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接,HTTP服务器在指定的端口监听客户端发送过来的请求,一旦收到请求,服务器端就会向客户端发回一个应答。

(2)FTP(File Transfer Protocol,文件传输协议)

是一个主要用于浏览远程目录和传输文件的协议。FTP使用两个网络连接,一个用来发送命令,另一个用来输出数据。FTP协议有一个状态,并且需要客户端在传输文件之前发送一些命令。FTP客户端建立一个连接,并在整个会话期间一直保持打开。在每个会话期间,可以发生多个传输。

QFtp类:
提供了一个支持FTP的客户端,它有以下特点:

  • 阻塞行为。QFtp是异步的,可以安排一系列的命令,而这些命令须等到控制权返回到Qt的事件循环后再执行。
  • 命令ID。每一个命令都有一个唯一的ID号,可以使用它来跟随命令的执行过程。
    例如,当每一个命令被执行时,QFtp都会使用改命令发射commandStarted()和commandFinished()信号。
  • 数据传输的进度提示。当有数据传输时,QFtp会发射信号(QFtp:dataTransferProgress()、QNetworkReply::downloadProgress()和
    QNetworkReply::uploadProgress()),可以关联这些信号到QprogressBar::setProgress()或者QProgressDialog::setProgress()上。
  • QIODevice支持。改类支持对QIODevice进行上传和下载操作。

主要有两种使用QFtp的方法:

  • 一般的方式是保持跟踪命令的ID号,通过关联到合适的信号来跟踪每一条命令的执行;
  • 另一种方式是一次安排所有的命令,然后只关联done()信号,当所有被安排的命令都执行后会发射该信号。

第一种方式需要更多的编程工作,但是这样可以对每一个单独的命令拥有更多的控制,还可以在前一个命令结果的基础上执行一个新的命令,并且可以为用户提供详细的反馈,所以一般使用这种方式。

2.获取网络接口信息

IP(Internet Protocol,互联网协议)是计算机网络相互连接进行通信时使用的协议,它规定了计算机在互联网上进行通信时应当遵循的规则, 有IPV4和IPV6两个版本。
QHostInfo类提供了静态函数可以进行主机名的查找,它使用了操作系统提供的查找机制来获取与主机名关联的IP地址,或者获取与IP地址关联的主机名。
这个类提供了两个便捷的静态函数进行查找:

  • lookupHost()异步进行工作,每当找到主机时都会发射信号;
  • fromName()会在查找时阻塞,并返回包含了查找结果的QHostInfo对象。

QNetworkInterface类:
在网络模块中还提供了QNetworkInterface类来获取主机的IP地址列表和网络接口信息。QNetworkInterface类代表了运行当前程序的主机的网络接口。

例如:
// 获取所有网络接口的列表
QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();  //获取主机上所有网络接口的列表
foreach (QNetworkInterface interface, list)  // 遍历每一个网络接口
{  
	qDebug() << "Name: " << interface.name(); // 接口名称
	qDebug() << "HardwareAddress: " << interface.hardwareAddress();  // 硬件地址
	// 获取IP地址条目列表
	QList<QNetworkAddressEntry> entryList = interface.addressEntries();     
	foreach (QNetworkAddressEntry entry, entryList)  // 遍历每一个IP地址条目
	{
		qDebug() << "IP Address: " << entry.ip().toString();  // IP地址
		qDebug() << "Netmask: " << entry.netmask().toString();  // 子网掩码
		qDebug() << "Broadcast: " << entry.broadcast().toString();  // 广播地址
	}
}		

3.UDP(User Datagram Protocol,用户数据报协议)

是一个轻量级的、不可靠的、面向数据报的、无连接的协议,用于可靠性不是非常重要的情况下。
适用于以下几种情况:

  • 网络数据大多为短消息。
  • 拥有大量客户端
  • 对数据安全性无特殊要求
  • 网络负担非常重,但对响应速度要求高。

UDP套接字:

QUdpSocket类用来发送和接收UDP数据报,继承自QAbstractSocket。
这里的Socket就是所谓的“套接字”,简单来说,套接字就是一个IP地址加一个port端口号。
其中IP地址指定了网络中的一台主机,而端口号指定了该主机上的一个网络程序,这样使用套接字就可以实现网络上两台主机上的两个应用程序之间的通信。
QUdpSocket支持IPv4广播。
传输模型:
第十八章 网络编程——Qt_第1张图片

4.TCP(Transmission Control Protocol,传输控制协议)

是一个用于数据传输的低层的网络协议,多个互联网协议(包括HTTP和FTP)都是基于TCP协议的。TCP是一个面向数据流和连接的可靠的传输协议。
传输模型:
第十八章 网络编程——Qt_第2张图片

建立过程:

  • 服务器:

    • 创建QTcpServer对象
    • 启动服务器(监听)调用成员方法listen(QHostAddress::Any,端口号)
    • 当有客户端链接时候会发送newConnection信号,触发槽函数接受链接(得到一个与客户端通信的套接字QTcpSocket)
    • QTcpsocket发送数据用成员方法write,
    • 读数据当客户端有数据来,QTcpSocket对象就会发送readyRead信号,关联槽函数读取数据
  • 客户端 :

    • 创建QTcpSocket对象
    • 链接服务器connectToHost(QHostAddress(“ip”),端口号)
    • QTcpsocket发送数据用成员方法write,
    • 读数据当对方有数据来,QTcpSocket对象就会发送readyRead信号,关联槽函数读取数据

补充:
三次握手建立连接:
第十八章 网络编程——Qt_第3张图片

四次握手断开连接:
第十八章 网络编程——Qt_第4张图片

注:TCP与UDP区别总结:

  • TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
  • TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
  • TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
  • 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
  • TCP首部开销20字节;UDP的首部开销小,只有8个字节
  • TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

你可能感兴趣的:(Qt,网络,qt,服务器)