Qt学习第四天

前言

Qt提供的所有的Socket类都是非阻塞的

Qt中常用的用于Socket通信的套接字类

QTcpServer:用于TCP/IP通信,作为服务器端套接字使用

QTcpSocket:用于TCP/IP通信,作为客户端套接字使用

QUdpSocket:用于UDP通信,服务器客服端都使用此套接字。

一、TCP编程

linux下

Qt学习第四天

Qt下

Qt学习第四天

1.TCP/IP服务器端通信的流程

  • 创建套接字
  • 将套接字设置为监听模式
  • 等待并接收客户端请求

可以通过QTcpserver提供的void newConnection()信号来检测是否有连接请求,如果有可以连接对应的槽函数中调用nextPendingConnect函数获取客户端的Socket信息(返回值为QTcpsocket *类型的指针),通过此套接字与客户端之间进行通信。

  • 接收或者向客户端发送数据

接收数据:使用read()或者readAll()

发送数据:使用write()函数

2.TCP/IP客户端通信的流程

  • 创建套接字
  • 连接服务器

可以使用QTcpSocket类的connectToHost函数来连接服务器

  • 向服务器发送或者接受数据

二、UDP编程

UDP的服务是无连接的,不区分服务器和客户端

linux下

Qt学习第四天

qt下

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

是否连接

面向连接

无连接

传输方式

基于流

基于数据报

传输可靠性

可靠

不可靠

传输效率

能否广播

不能

发表评论

相关文章