自制聊天室
程序概述
这个程序是仿照国内主流聊天APP编写的聊天软件,提供http通信服务,不做商业用途,只作为个人项目经验积累,以及供大家参考和指正。
环境及技术
- 框架:maven-springMVC
- 开发环境:idea
- 数据库:MySQL(myBatis)
- 系统:Ubuntu
- 客户端开发:Qt
- 日志:Log4j
提供功能
- 用户注册,登录
- 添加,删除好友
- 添加,退出,移出群聊
- 实时更新
- 用户,群聊日志
- 用户,群聊配置,可自定义属性(如群人数上限等)
思路
由易入难
想必很多程序都是这样子做的,因此我打算将日志和配置实现留给开发后期,先开发简易的好友及群聊处理
先思考后代码
在纸上,博客里先把思路写好,再搬到具体代码中,才能事半功倍
具体实现
数据存放
我将数据放到MySQL中,储存为:
(先来一张手写的草图,后续把对应图表补齐)
操作
-
注册操作(register)
判断用户传来的密码格式是否符合规范,判断用户是否存在,如果通过,则继续创建。-
创建6位id,代码如下
public static String createId(){ StringBuilder builder = new StringBuilder(); Random random = new Random(); for(int i = 0; i < 6; i++){ int num = random.nextInt(10);//0-9 builder.append(num); } return builder.toString(); } }
如果该id已存在,则重新获取:
int id = Integer.parseInt(KeyUtils.createId()); for(int i = 0; i < 5; i++){ if(result != 1){ id = Integer.parseInt(KeyUtils.createId()); } else { break; } } while (result != 1){ id++; id = id % 1000000;//999999 }
-
执行对应sql操作:(myBatis)
<insert id="insertUser" parameterType="com.zyj.pojo.User"> insert into ct_infos.users (`id`, `name`, `password`,`register_date`) values (#{id}, #{name}, #{password}, now()); </insert> <update id="createFriendTable"> create table ct_friends.u#{id} ( `id` mediumint not null primary key, `bind_date` DATE, `reception_num` mediumint not null default 0 ); </update> <update id="createGroupTable"> create table ct_groups.u#{id} ( `id` mediumint not null primary key, `bind_date` DATE, `updating_num` mediumint not null default 0 ); </update>
另外还需要在ct_uconfigs、ct_ulogs中创建表,暂未实现,所以不写。
在具体项目中的大部分代码都诸如此类,就不一一列举,接下来写的都是应对操作我的思路,然后代码实现为会上传到github,供大家参考。 -
-
好友相关操作
- 添加好友
- 删除好友
- 接受/拒绝好友申请
首先,要明确用上了哪几个表:
- ct_friends.uid
- ct_umsgs.uid
这里建表的方式可能让你感到奇怪,但我经过考虑,还是决定采用这种方式:在ct_friends库中为每一个用户建一张表,表名是u加上id,比如"u23578964",这样做可以防止重名,也便于查找。另外,直接用id作为表名绝对不行,因为id是数字,而表名不能以数字开头,然而myBatis通过了我的建表,却不让为对该表进行操作,为此为不得不删了整个库。
- 添加好友:
该操作与其他好友操作一样看起来很简单,但是有一个不得不解决的问题,就是实时数据的同步问题,譬如说,用户登陆的时候可以看到好友申请,也可以看到自己的申请是否被通过,因此需要引入一个状态