概念
windows 和 Linux 套接字相似
- 局域网和广域网
- 局域网:将一定区域内各种计算机,外部通信设备和数据库连接起来形成计算机通信的私有网络
- 广域网:又称广域网、外网、公网。是连接不同地区局域网或城域网的远程公共网络
TCP/UDP区别
|
TCP |
UDP |
建立连接 |
三次握手 |
无 |
断开连接 |
四次挥手 |
无 |
数据校验 |
数据丢失自动重传 |
无 |
传输协议 |
流式 |
报文 |
传输完成 |
断开连接 |
关闭套接字 |
流式传输协议:发送端接收端处理数据可以不均等。可以分次接收
报文传输:发送端发送数据与接收端接收数据相等。
TCP通信流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LmSGgBu8-1621870319644)(E:\Aha\学习\QT\qt并发网络通信\picture\tcp通信流程.png)]
UDP通信流程
ftp 与 http
套接字通信
在标准C++下没有提供专门用于套接字的通信,所以操作系统只能调用C的API函数。可以自己封装通信类。使用Qt提供的类进行基于TCP的套接字通信一共需要用到两个类:
QTcpServer:服务器类,用于监听客户端连接和客户端建立连接
QTcpSocket:通信的套接字类,客户端,服务器端都要使用
这两个通信模块network
QTcpServer
公共函数
liseten
bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)
- address:监听IP,默认 any,包含 ipv4 和 ipv6
- port:监听端口
islisten
bool QTcpServer::isListening() const
Returns true if the server is currently listening for incoming connections; otherwise returns false.
serverAddress
QHostAddress QTcpServer::serverAddress() const
如果设置监听,则返回监听地址,如果没有则返回 nullpter
serverPort
quint16 QTcpServer::serverPort() const
如果设置监听,则返回监听端口,否则返回0
端口范围:0-65535Ditto
0-1024 固定 建议使用 5000+
nextPendingConnection
[virtual] QTcpSocket *QTcpServer::nextPendingConnection()
阻塞等待客户端发起的连接请求,不推荐在单线程中使用,建议使用非阻塞方式处理新连接,即使用信号newConnection
waitForNewConnection
bool QLocalServer::waitForNewConnection(int msec = 0, bool *timedOut = Q_NULLPTR)
等待建立连接,没有连接回一直阻塞,不推荐使用
- msec:等待最大时间
- timeout:超时则为 true, 没有超时则为 false。
信号槽
acceptError
void QTcpServer::acceptError(QAbstractSocket::SocketError socketError)
当接收新连接失败时,发射此信号
newConnection
void QTcpServer::newConnection()
建立新连接时发出此信号
connectToHost
[virtual] void QAbstractSocket::connectToHost
(const QString &hostName, quint16 port, OpenMode openMode = ReadWrite, NetworkLayerProtocol protocol = AnyIPProtocol)
连接服务器,需要指定服务器绑定的IP和端口
- hostName:指定要连接的地址 IP地址
- port:服务器端绑定的端口
- openMode:read/write
- protocol:使用默认
QTcpSocket
这是一个套接字通信类,不管是客户端还是服务端都要使用到。在Qt中发送和接收数据也属于IO操作。这是继承关系
QFile主要操作磁盘数据,QTcpSocket操作网络数据
公共函数
读取数据
qint64 QIODevice::read(char *data, qint64 maxSize);
QByteArray QIODevice::read(qint64 maxSize);
QByteArray QIODevice::readAll();
- c 语言风格读入,指定最大数据,读到指针data中
- Qt风格读入,设定可接收的最大数据,返回字符串
- 全部读入,返回读出的字符串
写入数据
qint64 QIODevice::write(const char *data, qint64 maxSize);
qint64 QIODevice::write(const char *data);
qint64 QIODevice::write(const QByteArray &byteArray);
- 发送指针,向 内存中写入 maxSize 个数据
- 发送 data 向指向的内存中写入数据, 以
\0
结束
- 发送参数指定的字符串
信号
connected
[signal] void QAbstractSocket::connected()
connectToHost()建立连接成功发出此信号
disconnected
[signal] void QAbstractSocket::disconnected()
当断开连接时发送此信号
readyRead()
[signal] void QIODevice::readyRead()
数据到达发送此信号
Qt 的write() 与read() 都不是直接操作的网络数据,而是操作的Qt维护的在本地磁盘的数据。