承接上章:Qt一步步搭建TcpServer0——序
要搭建网络库,那么肯定要从Server和Socket开始入手,本章就从封装QTcpServer和QTcpSocket开始入手,做好第一步工作。
1、序
1.1、NetAPI的设计思路
画了一张图来描述思路,一般来说,网络库的思路大都如下:
其实图中注释描述的也比较清楚,能够较为直观体现出Server端的网络库多线程工作流程,我觉得也就没必要再过多解释了。
1.2、了解QTcpServer
官网文档地址:QTcpServer
关于QTcpServer的介绍,官方已经说的比清楚了:
基本上是属于傻瓜式编程,大部分的工作都由底层给我们做好了。通常情况下,我们只需要监听一下端口,绑定个newConnection()就可以在新连接连入的时候获取到套接字:
int port = this->ui->spinBox->value();
QTcpServer *tcpserver = new QTcpServer();
tcpserver->listen(QHostAddress::Any, port);
connect(tcpserver, &QTcpServer::newConnection, this, &MainWindow::SlotNewConnection);
然后通过nextPendingConnection获取套接字就行了。
1.3、设计QtcpServer
关于QTcpServer的设计其实主要有两种方式:
1、组合:如上面官方介绍所言,以组合的形式封装QTcpServer,然后连接newConnection信号槽,在槽函数里nextPendingConnection获取新socket,而这个socket将由QTcpServer来管理,自动删除:
2、继承:继承自QTcpServer,然后重载函数incomingConnection,在函数里自己去创建Socket对象并管理。
方式一和方式二其实都可以,但对我而言,我需要自定义socket,并且这个socket将会抛给上层,上层在整个过程中可能会存在需要使用到socket对象的情况,生命周期需要我的网络库来掌管,那么我将使用方式二。
1.4、开始
新建项目,在pro文件中添加network库:
QT += core gui network
2、TcpServer的封装
TcpServer封装自QTcpServer,基本功能底层已经做了很多,那么我们要做的就是做成能够直接用于项目需求上