目录
目录
Posts List
  1. TCP/IP
  2. Socket套接字
  3. Qt中的TCP通信
    1. 客户端
    2. 服务器
  4. 编码转换
  5. Qt中的UDP通信
    1. 发送端
    2. 接收端

Qt学习 P6:网络编程

TCP/IP

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是一组实现网络信息传输的协议簇,包括FTP、SMTP、TCP、UDP、IP等协议。由于TCP协议和IP协议最具代表性,故得名TCP/IP协议。

Client-Server(C/S,即服务器-用户机)结构是一种常用的通信结构。

Socket套接字

套接字(Socket)是对网络上双向通信端点的抽象,通过套接字进行网络通信可以避免底层网络协议的复杂实现。

一个Socket与一个IP地址的一个端口绑定进行通信。

Qt中的TCP通信

Qt中提供了简单的TCP通信套接字。

要使用Qt中的网络模块,需要先在.pro文件中加入:

1
QT += network

客户端

使用QTcpSocket类。

1
2
3
4
5
6
7
socket = new QTcpSocket(); // 创建套接字对象
socket->connectToHost(IP, port); // 连接到服务器
if (!socket->waitForConnected(3000)) // 等待不超过3000ms,返回连接成功与否
qDebug() << "连接失败";
socket->write(data); // 发送数据
socket->flush(); // 一般会自动刷新缓冲区,但也可以手动调用
socket->close(); // 断开连接

当socket收到新数据时,会发出readyRead信号。

1
2
3
4
5
6
connect(socket, &QTcpSocket::readyRead, [=]() {
QByteArray buffer;
buffer = socket->readAll(); // 读取全部缓冲区数据
buffer = socket->read(16 * 1024); // 读取至多16KB数据
......
});

当socket连接成功/断开时,会发出connected/disconnected信号。

服务器

服务器需要使用QTcpServer类。

1
2
3
server = new QTcpServer(); // 创建服务器对象
server->listen(QHostAddress::Any, port); // 开始监听一个端口
server->close(); // 停止监听

当服务器被客户端访问,会发出newConnection信号。用一个QTcpSocket对象接受客户端的访问,建立关系。

1
2
3
connect(server, &QTcpServer::newConnection, [=]() {
socket = server->nextPendingConnection(); // 获得下一个等待连接的客户端的socket
});

编码转换

1
2
QByteArray buffer = str.toUtf8(); // utf-8编码
str = QString::fromUtf8(buffer); // utf-8解码

Qt中的UDP通信

UDP(User Datagram Protocol,用户数据报协议)是一个轻量级的,不可靠的,面向数据报的无连接协议。

由于不需要建立连接,UDP通信比TCP通信更为简单,但在网络较差的环境下也容易丢包。

发送端

1
usocket->writeDatagram(msg, QHostAddress("127.0.0.1"), port); // 发送数据报

接收端

1
2
3
4
5
6
7
8
9
usocket->bind(QHostAddress("127.0.0.1"), PORT); // 首先绑定监听的端口
connect(usocket, &QUdpSocket::readyRead, [=]() {
QByteArray buffer;
while(usocket->hasPendingDatagrams()) {
buffer.resize(usocket->pendingDatagramSize());
usocket->readDatagram(buffer.data(), buffer.size());
......
}
});