# Bing-IM **Repository Path**: mqb98/bing-im ## Basic Information - **Project Name**: Bing-IM - **Description**: netty im 练手项目 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-09-11 - **Last Updated**: 2022-12-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Bing-IM #### 介绍 netty im 练手项目 #### 软件架构 软件架构说明 #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 2022-09-11 完成基本在线单聊功能,待完善离线消息 ```TEX c1 server c2 | R1 | | | -----> | | | A1 | | | <----- | | | | D1 | | | -----> | | | R2 | | | <----- | | | A2 | | | -----> | | N2 | | | <----- | | 消息类型分为四大类: R;RequestMsg:客户端向服务端发送的消息都封装为 RequestMsg(登陆相关的除外) A:AckMsg:对于客户端发送的每一个R,服务端都会回复一个AckMsg作为确认机制 D:DeliverMsg:当服务端将 发送者消息 转发给 接收者 时使用 N:NotifyMsg:服务端通知消息,此处暂时为最终的消息发送完整时的标志 ----- RequestMsg 两个核心属性: id:标识一条消息 receivedFlag:表示接收者是否已经接收到(此字段在服务端使用,用于判断是发送 notify 还是 ack) 消息发送全流程,c1 发送 RequestMsg(id, false) 给 c2: R1__1. c1 发送 RequestMsg(id, false) 给 server A1__2. server 回复 c1 AckMsg(id) 表示 服务端收到了消息 D1__3. server 转发消息 DeliverMsg(id) 给 c2。 (将这个RequestMsg直接嵌套在DeliverMsg里面) R2__4. c2 发送 RequestMsg(id, true) 给 server A2__5. server 回复 c2 AckMsg(id) 表示服务端收到了消息 N2__6. server 提醒消息 Notify(id) 给 c1,表示接收方已经确认收到了消息 若R1、A1两部中出现问题,导致消息没有发送成功,直接提示【消息发送失败即可】 若D1、R2、A2、N2出现问题,客户端加一个失败队列,若一定时间内没有收到N2消息,则视为发送失败,进行重试(客户端考虑加去重) ``` -- -- -- -- 2022-09-12 完善ack机制,只以发送方是否收到 A1 和 N2 来判断,接收方是否收到 D1 和 R2 不做判断。 解决粘包问题,统一在数据前面添加4个字节来表示长度。 添加定时任务,用于扫描超时/失败消息,(待整理定时任务频率和消息超时时间),待完善离线消息。 ```TEX 测试: 启动一个 server,两个 client,分别加上program args: mario luicy 和 luicy mario 第一个参数表示当前用户,第二个参数表示目标用户,在控制台输入聊天信息 ``` 2022-09-13 客户端引入sqlite,存储已经收到过的msg_id & user_id,用于消息去重