# im-system **Repository Path**: chen-sir-c/im-system ## Basic Information - **Project Name**: im-system - **Description**: 基于netty即时通讯系统 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2024-07-12 - **Last Updated**: 2024-08-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 即时通讯系统 ## 1.好友关系链 ### 1.1 好友关系链设计 弱好友关系 - sub关注表(uid1,uid2) - fans粉丝表(uid2,uid1) - a关注b,关注表插入a关注b 同时粉丝表插入b新增粉丝a 强好友关系 - friend (uid1,uid2) - 举例:当用户a,b,c互相是好友关系,需要插入三条记录,插入顺序按uid1重小到大排序,(a,b),(a,c),(b,c) - 当查询某个用户,拥有的好友时,需要通过union联合查询,a,b字段才能获取完整,select * from frident where uid1 = a union select * from frident where uid2 = b - 优化:采用数据冗余方式,保持强好友关系 - 当a,添加了好友b时,此时插入两表记录,(a,b)和(b,a) ,需要查询好友列表时:select * from frident where uid1 = a; 表的设计: 好友关系表:im_friendship ![image-20240712171139873](README.assets/image-20240712171139873.png) ### 1.2 好友关系链开发 #### 批量导入好友关系链接口 测试: ``` ``` #### 判断是否存在好友关系(单向) ```sql SELECT from_id AS fromId, to_id AS toId, IF ( black = 1, 1, 0 ) AS black FROM `im_friendship` WHERE from_id = 'lld' AND to_id IN ( 'lld1', 'lld2', 'lld4', 'lld5' ) ``` #### 判断是否存在好友关系(双向) ```sql SELECT a.fromId,a.toId, ( case when a.black = 1 and b.black = 1 then 1 when a.black = 1 and b.black != 1 then 2 when a.black != 1 and b.black = 1 then 3 when a.black != 1 and b.black != 1 then 4 end ) as black FROM ( SELECT from_id AS fromId, to_id AS toId, IF ( black = 1, 1, 0 ) AS black FROM `im_friendship` WHERE from_id = 'lld' AND to_id IN ( 'lld1', 'lld2', 'lld4', 'lld5' ) ) AS a INNER JOIN ( SELECT from_id AS fromId, to_id AS toId, IF ( black = 1, 1, 0 ) AS black FROM `im_friendship` WHERE to_id = 'lld' AND from_id IN ( 'lld1', 'lld2', 'lld4', 'lld5' ) ) AS b ON a.fromId = b.toId AND a.toId = b.fromId ``` 好友申请表: id int 11 from_id varchar 50 to_id varchar 50 app_id bigint 20 小红点 tinyint 是否已经读 添加备注 varchar 255 remark varchar 50 审批结果 tinyint 5 创建时间 bigint 20 更新时间 bigint 20 添加来源 varchar 100 # TCP网关 创建im-tcp模块 新建LimServer类,实现serversocket服务器端的通讯配置以及处理链,测试 新建LimWebSocketServer类,给处理链填写协议升级等内容完成websocket通信,测试 抽取端口到yml文件,使用工具解析yml文件 config.yml 自定义协议: 编写解码类MessageDecoder 继承于ByteToMessage 重写decode方法 同时创建MessageHeader实体类,封装解析后消息 编写Redis管理客户端,保存用户信息 编写SessionSocketHolder类管理channel通道 编写HearBeatHandler类,当读写空闲超时事件发生时,将用户状态修改为离线状态,离线状态还是可以接收消息的推送的,而退登状态则无法即时消息。 √ 编写Mq管理器, 编写MqMessageProducer 消息投递 编写MessageReciver 消息接收 并发送给对应的userId的channel通道 mq+注册中心 注册中心:Zookeeper ZKit类 对初始化zk父类或者子节点 RegistryZk 类 实现服务器的注册