目录
网络编程
1. 复习时间
【提问】TCP和UDP的区别?
UDP TCP 协议相同点:都存在于传输层,全双工通信
1.1 TCP:全双工通信、面向连接、可靠
TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)。
高可靠原因:
1.三次握手、四次挥手
2.序列号和应答机制
3.超时,错误重传机制
4.拥塞控制、流量控制(滑动窗口)
适用场景
适合于对传输质量要求较高的通信
在需要可靠数据传输的场合,通常使用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
标签:QTcpServer,day09,Qt,编程,UDP,TCP,IP地址,连接,端口号 From: https://blog.csdn.net/QR70892/article/details/143136016