Qt学习第四天
Posted 五个板栗
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt学习第四天相关的知识,希望对你有一定的参考价值。
前言
Qt提供的所有的Socket类都是非阻塞的
Qt中常用的用于Socket通信的套接字类
QTcpServer:用于TCP/IP通信,作为服务器端套接字使用
QTcpSocket:用于TCP/IP通信,作为客户端套接字使用
QUdpSocket:用于UDP通信,服务器客服端都使用此套接字。
一、TCP编程
linux下
Qt下
1.TCP/IP服务器端通信的流程
- 创建套接字
- 将套接字设置为监听模式
- 等待并接收客户端请求
可以通过QTcpserver提供的void newConnection()信号来检测是否有连接请求,如果有可以连接对应的槽函数中调用nextPendingConnect函数获取客户端的Socket信息(返回值为QTcpsocket *类型的指针),通过此套接字与客户端之间进行通信。
- 接收或者向客户端发送数据
接收数据:使用read()或者readAll()
发送数据:使用write()函数
2.TCP/IP客户端通信的流程
- 创建套接字
- 连接服务器
可以使用QTcpSocket类的connectToHost函数来连接服务器
- 向服务器发送或者接受数据
二、UDP编程
UDP的服务是无连接的,不区分服务器和客户端
linux下
qt下
使用Qt提供的QUdpSocket进行UDP通信,在UDP方式下,客户端不与服务器建立连接,只是负责调用发送函数向服务器发送数据。服务器也不从客户端接收连接,只是负责调用接收函数,等待客户端的数据到达。
在UDP通信中,服务器端和客户端的概念已经被淡化,两部分工作都大致相同:
- 创建套接字
- 绑定套接字
在UDP中如果需要接收数据则需要对套接字进行绑定,只发送数据不需要对套接字进行绑定。通过调用bind()函数将套接字绑定在指定端口上。
- 接收或者发送数据
接收数据:使用readDatagram()接收数据,函数声明如下
qint64 readDatagram(char* data,qint64 maxsize,
QHostAddress *address=0,quint16 *port=0)
参数
data:接收数据的缓存地址
maxSize:缓存接收的最大字节数
address:数据发送方的地址(一般使用提供的默认值)
port:数据发送方的端口号(一般使用提供的默认值)
使用pendingDatagramSize()可以获取到将要接收的数据的大小,
根据该函数返回值来准备对应大小的内存空间存放将要接收的数据
发送数据
使用writeDatagram()函数发送数据,函数声明如下
qint64 writeDatagram(const QByteArray &datagram,
const QHostAddress & host,quint16 port)
参数
datagram:要发送的字符串
host:数据接收方的地址
port:数据接收方的端口号
三、TCP和UDP的区别
TCP/IP | UDP | |
是否连接 | 面向连接 | 无连接 |
传输方式 | 基于流 | 基于数据报 |
传输可靠性 | 可靠 | 不可靠 |
传输效率 | 低 | 高 |
能否广播 | 不能 | 能 |
以上是关于Qt学习第四天的主要内容,如果未能解决你的问题,请参考以下文章