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 | socket = new QTcpSocket(); // 创建套接字对象 |
当socket收到新数据时,会发出readyRead
信号。
1 | connect(socket, &QTcpSocket::readyRead, [=]() { |
当socket连接成功/断开时,会发出connected/disconnected
信号。
服务器
服务器需要使用QTcpServer
类。
1 | server = new QTcpServer(); // 创建服务器对象 |
当服务器被客户端访问,会发出newConnection
信号。用一个QTcpSocket
对象接受客户端的访问,建立关系。
1 | connect(server, &QTcpServer::newConnection, [=]() { |
编码转换
1 | QByteArray buffer = str.toUtf8(); // utf-8编码 |
Qt中的UDP通信
UDP(User Datagram Protocol,用户数据报协议)是一个轻量级的,不可靠的,面向数据报的无连接协议。
由于不需要建立连接,UDP通信比TCP通信更为简单,但在网络较差的环境下也容易丢包。
发送端
1 | usocket->writeDatagram(msg, QHostAddress("127.0.0.1"), port); // 发送数据报 |
接收端
1 | usocket->bind(QHostAddress("127.0.0.1"), PORT); // 首先绑定监听的端口 |