客户端TCP管理者
因为聊天服务要维持一个长链接,方便服务器和客户端双向通信,那么就需要一个TCPMgr来管理TCP连接。
而实际开发中网络模块一般以单例模式使用,那我们就基于单例基类和可被分享类创建一个自定义的TcpMgr类,在QT工程中新建TcpMgr类,会生成头文件和源文件,头文件修改如下
1 |
|
接下来我们在构造函数中连接网络请求的各种信号
1 | TcpMgr::TcpMgr():_host(""),_port(0),_b_recv_pending(false),_message_id(0),_message_len(0) |
连接对端服务器
1 | void TcpMgr::slot_tcp_connect(ServerInfo si) |
因为客户端发送数据可能在任何线程,为了保证线程安全,我们在要发送数据时发送TcpMgr的sig_send_data信号,然后实现接受这个信号的槽函数
1 | void TcpMgr::slot_send_data(ReqId reqId, QString data) |
然后修改LoginDialog中的initHandlers中的收到服务器登陆回复后的逻辑,这里发送信号准备发起长链接到聊天服务器
1 | void LoginDialog::initHttpHandlers() |
在LoginDialog构造函数中连接信号,包括建立tcp连接,以及收到TcpMgr连接成功或者失败的信号处理
1 | //连接tcp连接请求的信号和槽函数 |
LoginDialog收到连接结果的槽函数
1 | void LoginDialog::slot_tcp_con_finish(bool bsuccess) |
在这个槽函数中我们发送了sig_send_data信号并且通知TcpMgr将数据发送给服务器。
这样TcpMgr发送完数据收到服务器的回复后就可以进一步根据解析出来的信息处理不同的情况了。我们先到此为止。具体如何处理后续再讲。