# cloud **Repository Path**: imrockbiao/cloud ## Basic Information - **Project Name**: cloud - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-22 - **Last Updated**: 2025-04-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 03 配置文件IP地址和端口号 1. 把client.config配置文件添加到资源文件中 2. 把client.config配置文件中的字符串转化为IP地址和端口号 # 04 .pro项目文件添加网络模块 1. TcpClient.pro文件添加network模块 2. 客户端添加QTcpSocket, 用来连接服务器和收发数据 3. 连接服务器, 需要用到QHostAddress头文件, 把IP地址转化为这样的类型 4. 客户端连接服务器成功触发connected信号, 自定义槽函数要提前和这个connected信号关联 ```C++ //提前关联connected信号和槽函数, 用来提醒客户端已经连接到了服务器 //connect(&m_tcpSocket, &QTcpSocket::connected, this, &TcpClient::showConnect); connect(&m_tcpSocket, SIGNAL(connected()), this, SLOT(showConnect())); ``` # 05 服务器搭建 1. 新建项目TcpServer 2. 把IP地址和端口号的配置文件复制给服务器一份 3. 把这个配置文件作为资源文件添加到服务器项目中 4. 服务器需要绑定IP地址和端口号 5. 添加新类 MyTcpserver, 项目文件添加网络模块 6. 为了自定义类支持信号和槽机制, 1. 需要添加Q_OBJECT宏 2. 需要继承QObject 7. 单例模式 1. static MyTcpServer &getInstance(); 8. 当新添加一个自定义类且使用了Q_OBject宏的时候,需要重写执行qmake构建, 要不会导致错误信息, 子类没有实现父类的虚函数 [【Qt】报错error: undefined reference to `vtable for的解决方法_qt error: undefined reference to `vtable for icomm-CSDN博客](https://blog.csdn.net/u010168781/article/details/105298677) 9. 开启两个QtCreator有一个控制台不会输出 # 06 通信协议 1. 弹性结构体 1. 弹性结构体测试, 新建testStruct工程 2. 通讯协议 通讯协议就是把最后一个实际消息设置为一个空数组, 空数组不分配内存不占用空间 PDU Protocol Data Unity 1. uilPDULen总的消息的大小 2. uiMsgType消息类型 3. uiMsgLen实际消息的大小 4. 实际消息 3. 数据收发 4. 在客户端新添加通讯消息头文件 5. 在服务器端添加MyTcpSocket类, 用来存储和区分不同的客户端 # 07 登录注册退出注销-1 1. 数据库操作 1. 数据库操作定义为单例类, 专门用这个类来进行数据的操作 2. 服务器端创建数据库 1. 创建用户表userInfo 2. 创建好友表 PS D:\_08_qt\_00_pros\cloud\TcpServer> sqlite3 cloud.db SQLite version 3.46.0 2024-05-23 13:25:27 (UTF-16 console I/O) Enter ".help" for usage hints. sqlite> create table usrInfo( (x1...> id integer primary key autoincrement, (x1...> name varchar(32) unique, (x1...> pwd varchar(32), (x1...> online integer default 0); sqlite> create table friend(id integer, friendId integer, primary key(id, friendId)); sqlite> 3. 服务器添加数据库操作类 1. 通过单例对象对数据库进行操作 2. 连接数据库需要向.pro文件中添加sql模块 3. 使用数据库使用头文件 QSqlDatabase 4. 查询数据库使用头文件 QSqlQuery 5. 数据库作为资源文件添加到TcpServer项目中 3. 不要使用资源加载的方式加载数据库文件 4. 使用绝对路径的方式打开数据库访问数据库 # 08 登录注册退出注销-2 1. 客户端的登录注册注销请求 1. 数据协议中添加枚举类型, 区分不同的消息类型 2. 编辑好用户端的界面 3. 在注册按钮的槽函数中实现发送注册信息的逻辑 # 09 登录注册退出注销-3 1. 客户端向服务器发送注册请求 2. 服务器收到客户端发来的注册消息, 把用户名和密码添加到userInfo中 1. 注册成功后返回给客户端注册成功消息 2. 客户端接收服务器返回的注册成功消息 3. 服务器添加用户数据显示 # 10 登录注册退出注销-4 1. 实现用户登录 1. 防止重复登录, 在线不允许登录 2. 用户名正确, 密码正确, 用户不在线, 三个条件同时满足允许登录 3. 登录协议码修改 # 11 登录注册退出注销-5 1. 实现用户注销, 退出 1. 用户退出的时候服务器需要把socket链表上用户的socket也给删除, 否则下一次用户登不上 2. 关闭socket, 触发socket的disconnected信号 # 12 界面设计 1. 好友操作界面 2. 图书界面 3. TcpClient项目添加 # 13 登录跳转 客户端登录跳转 登录成功显示主界面, 登录界面隐藏 不成功停留在登录界面 # 14 查看在线用户1 客户端使用信号槽, 从一个类向另一个类传递参数 客户端向服务器发送查询请求 # 15 查看在线用户2 服务器返回客户端的请求 客户端在Online框中显示所有在线用户 # 16 查找用户 客户端发送查找消息 服务器接收查找消息 服务器搜索数据库 服务器返回给客户端消息 客户端接收服务器的查询结果, 显示在客户端界面 # 17 添加好友1 客户端在QWidgetList中选中在线的好友, 把添加好友请求发送给服务器 服务器判断两个用户的关系, 把返回结果返回给客户端