Qt_day8_网络编程

1. 复习时间

【提问】TCP和UDP的区别?

UDP TCP 协议相同点:都存在于传输层,全双工通信

1.1 TCP:全双工通信、面向连接、可靠

TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)。

高可靠原因:1. 三次握手、四次挥手

  1. 序列号和应答机制
  2. 超时,错误重传机制
  3. 拥塞控制、流量控制(滑动窗口)

适用场景

适合于对传输质量要求较高的通信

在需要可靠数据传输的场合,通常使用TCP协议

即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议

1.2 UDP:全双工通信、面向无连接、不可靠

    UDP(User Datagram Protocol)用户数据报协议,是不可靠的无连接的协议。在数据发送前,因为不需要进行连接,所以可以进行高效率的数据传输

 适用场景

发送小尺寸数据(如对DNS服务器进行IP地址查询时)

适合于广播/组播式通信中。

以及音视频通讯通常采用UDP协议

【提问】IP和端口号?

1.3 IP地址

IP地址是Internet中主机的标识,Internet中的主机要与别的机器通信必须具有一个IP地址,IP地址为32位(IPv4)或者128位(IPv6),IPV4表示形式:常用点分十进制形式,如202.38.64.10,最后都会转换为一个32位的无符号整数。

1.4 端口号

为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区分

TCP端口号与UDP端口号独立(UDP port为8888,TCP port也可为8888 )

端口号一般由IANA (Internet Assigned Numbers Authority) 管理

端口用两个字节来表示

众所周知端口(被占用):1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用)
已登记端口:1024~49151(----可用来建立与其它主机的会话----) 
动态或私有端口:49152~65535 --固定某些服务使用--

补充,Qt建议使用端口号:

  • 2000+
  • 避免连号,例如8888/6666等

2. 编程之前

与数据库编程一样,Qt的网络编程之前需要先在.pro文件中增加网络模块。

Qt网编主要用到以下几个类:

  • QTcpServer

基于TCP的Socket服务器连接管理类,本身不继承QIODevice,因此无法进行IO操作。

  • QTcpSocket

基于TCP的Socket连接类,间接继承了QIODevice,是实现IO的TCP类。

  • QTextStream | QByteArray

数据传输的方式,前者为更加封装类型,适合Qt之间进行通信;后者为字节数组,适用性更广泛一些。

3. 相关函数

网络编程中使用的相关函数如下:

 

// 构造函数
QTcpServer::​QTcpServer(QObject * parent = 0)
// 开启网络监听,等待客户端发起连接请求
// 参数1:QHostAddress为IP地址封装类,QHostAddress::Any表示监听所有IP地址发起的请求。
// 参数2:端口号,默认值0表示自动选择。
// 返回值:监听是否成功
bool QTcpServer::​listen(const QHostAddress & address = QHostAddress::Any, quint16 port = 0)
// 关闭监听
void QTcpServer::​close()
// 构造函数
QTcpSocket::​QTcpSocket(QObject * parent = 0)
// 服务器发起连接请求
// 参数1:服务器的IP地址
// 参数2:服务器的端口号
// 参数3:数据流打开模式,默认为读写
void QAbstractSocket::​connectToHost(const QString & hostIP, quint16 port, OpenMode openMode = ReadWrite)
// 建立连接成功的信号
void QTcpServer::​newConnection()            [signal]
// 连接成功和失败的信号
void QAbstractSocket:: connected()            [signal]
void QAbstractSocket::disconnected()            [signal]
// 返回数据流是否打开
bool QIODevice::​isOpen() const
// 为主动发起请求的每一个客户端分配一个对应的连接对象
// 返回值为TCP连接对象
QTcpSocket * QTcpServer::​nextPendingConnection()    
// 拿到对面的IP
QHostAddress QAbstractSocket::​peerAddress() const
// 拿到对面的端口号
quint16 QAbstractSocket::​peerPort() const
// 拿到IP的字符串,在某些计算机中返回值的IP地址字符串前面有一些多余内容
QString QHostAddress::​toString() const
// 有新数据可读时发射
void QIODevice::​readyRead()            [signal]
// 读取所有内容到字节数组中
QByteArray QIODevice::​readAll()
// 构造函数
// 参数:一个支持IO的对象
QTextStream::​QTextStream(QIODevice * device)
// 输出内容
// 参数:要输出的文本内容(QString)
// 返回值:支持链式调用
QTextStream & QTextStream::​operator<<(const QString & string)
// 读取所有字符串
QString QTextStream::​readAll()

【单工示例代码】

通过网盘分享的文件:Day7_24072_Client (2).zip

链接: https://pan.baidu.com/s/1LVFaYOardq8VV2IlggR_UQ 提取码: d7xx

--来自百度网盘超级会员v7的分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值