读取配置文件
准备好配置文件并加载配置文件:IP PORT
客户端通过主动连接服务端,通过IP得到服务端的地址,通过PORT来实现端对端的通信。
服务端监听本地IP,等待客户端连接。
这里为了将应用程序的配置参数和选项与代码分离,提供更好的灵活性和可维护性。试想一下从代码中找到代码中定义的变量然后修改和直接找到配置文件修改哪个方便?
client.config //客户端配置文件
127.0.0.1
8888
server.config //服务端配置文件
127.0.0.1
8888
在tcpclient.h中设置变量存储IP和PORT(m_strIP和m_usPort),并通过loadConfig()函数来加载变量的值。
客户端服务器搭建
计算机通信需要通过一定的协议,客户端和服务端都遵循这个协议才能稳定安全的通信,本项目的通信协议如下所示:
struct PDU{
uint uiPDULen; //消息分配的空间
uint uiMsgType; //消息类型
char caData[64]; //存放文件名
uint uiMsgLen; //实际消息长度
int csMsg[]; //存放实际消息
};
这里的PDU的占用空间是不定的,由于csMsg是用来根据信息开辟真正的空间,存放实际的消息。因此一个对于一个PDU来说,总的占用空间是sizeof(PDU)+csMsg实际开辟出来的空间。(sieof(PDU)只包含前四项所占的内存空间)
sizeof(PDU) = sizeof(uint) + sizeof(uint) + sizeof(char[64]) + sizeof(uint) + sizeof(int*)
= 4 + 4 + 64 + 4 + 8
= 84
而具体的业务流程如下图所示:
对于TcpServer、MyTcpServer、MyTcpSocker感到迷惑的请看下图:
登陆注册退出注销
所有用户信息保存在数据库中,数据库采用sqlite3而不是MySQL。添加类OpeDB来操纵数据库,为了支持数据库需要添加`sql`支持。在server执行前需要把数据库连接好,因此在main函数中提前设置好数据库的连接。数据库连接采用单例模式。
点击`x`来退出客户端的程序流程图如下:
1、当有client和server连接时,在incommingConnection函数中绑定-当offine被触发时调用deleteSocket函数,该函数负责从client连接队列中删除下线的socket.
2、当有client断开连接时,会触发clientOffline函数,该函数会调用OpeDB中的handleOffline函数来修改数据库中的`online`字段。同时发送offline信号,而该信号会触发deleteSocket的调用(disconnected和clientOffline的绑定在MyTcpSocket的构造函数中就进行了)。
界面设计:新增book界面和friend界面,当用户成功登录后会将TcpClient的UI隐藏而将OpeWidget的界面显示出来。根据选择的不同-book或friend显示不同的内容。
而对于显示在线用户来说:
1、点击按钮后触发showOnline()函数,该函数将 请求发送给server
2、server根据请求操纵数据库得到online字段为1的用户名并回传给client
3、client根据回传的消息类型,调用showAllOnlineUsr函数,该函数进一步调用showUsr
本来想再画一下查找用户的函数图,看了下查找用户、查看在线用户、添加好友等都是先向服务器发送请求,然后服务器回复,客户端接收到后做进一步处理,区别不大,自己理解一下就可以。
至于私聊和群聊,发送者向服务端传递自己要交流的对象的名字,服务器通过数据库找到对应的接收对象并将pdu转发给接收对象。
接下来的就是文件的一系列操作了:
看了一下,都是客户端与服务端之间的交互以及一些对文件的处理。需要熟悉QT的一些类的使用,例如QDir文件操纵等,逻辑比较简单。
源代码如下:https://download.youkuaiyun.com/download/pan_1214_/87811515