目录
概要
在前段时间,基于QT开发了一个TCP调试工具,使用QTcpServer类来开发服务端。本篇文章主要总结了QTcpServer开发TCP服务端的一些技术和代码,方便以后复习和给使用QTcpServer开发TCP服务端的同学一个参考
TCP调试工具下载地址:链接:https://pan.baidu.com/s/1grubWJlF8CtKGrcVsEvO5Q 提取码:4lkt
TCP服务端生命周期
开发TCP服务端主要有如下几个过程
- 建立服务端套接字
- 与特定的网络地址和服务端口绑定,并侦听客户端连接请求
- 接收TCP客户端连接请求,建立虚拟电路连接
- 关闭服务端套接字的侦听状态
- 释放套接字资源
概念说明
关于网络地址,典型地一个网卡连接到一个网络会有一个网络地址,在系统中安装了虚拟机等软件后,会出现一些虚拟的网络地址,此外系统中还有两个特殊的网络地址,127.0.0.1环回地址和0.0.0.0未绑定地址。服务端套接字和具体网络地址绑定后,只能接受该网段的网络连接。但是0.0.0.0比较特殊,TCP服务端用0.0.0.0网络地址绑定后,可以接受客户端用本机所有网络地址发过来的连接请求;此外如果A子网IP和0.0.0.0都侦听了5000端口,客户端用A子网IP地址和5000端口向服务端发起连接,服务端会把这个连接优先A子网地址的服务接收连接。TCP服务端用127.0.0.1网络地址绑定后,只能接受客户端用127.0.0.1请求的连接。
// 打印本机除0.0.0.0外的所有的IPV4网络地址
QList<QHostAddress> list = QNetworkInterface::allAddresses();
foreach (QHostAddress address, list)
{
if (address.protocol() == QAbstractSocket::IPv4Protocol)
{
qDebug() << address.toString();
}
}
关于端口,端口取值范围是一个无符号短整数0-65535,由于1023以下的端口已经分配给了常用的一些应用程序,所以网络编程可用端口一般用1024-65535之间的整数。在TCP网络连接中,双方服务器的网络地址和双方应用程序的端口来唯一确定了虚拟的电路连接。
主要的代码
为了便于清晰简洁地描述TCP服务端编码,防止项目中其它如界面、交互和资源管理等代码的干扰。所以只抽取了代码中少量的核心代码,方便阅读和理解。
- 在项目文件.pro中添加QT网络库的引用,
QT += network
2. 建立服务端套接字对象
#include <QTcpServer>
...
QTcpServer *pServer = new QTcpServer(this);
3. 与特定的网络地址和端口号绑定
4. 接收TCP客户端连接请求,建立虚拟电路连接
// 提前把接受网络连接的信号和槽关联起来,以便接受连接
connect(pServer, &QTcpServer::newConnection, this, [=](){
QTcpSocket *pSocket = pServer->nextPendingConnection();
...
});
QHostAddress address(ip); // ip ipv4或者ipv6地址
if(tcpServer->listen(address, port)) //port 端口
{
// 成功的处理逻辑
}
else
{
// 失败的处理逻辑
QMessageBox::warning(this, tr("警告"),tr("打开服务端口失败"), tr("确定"));
}
5. 关闭服务端套接字的侦听状态
6. 释放套接字资源
pServer->close(); // 关闭套接字的侦听
delete pServer;
pServer = nullptr;
小结
上面对服务端网络编程需要用到的概念进行了阐述,也对使用QTcpServer类开发TCP服务端的主要过程进行了代码展示。这里展示了服务端接收客户端的连接请求,并得到了QTcpSocket *pSocket的对象。下一篇会对客户端使用QTcpSocket 发起连接,以及基于QTcpSocket 收发数据进行说明。