在线用户接口
这是一个辅助接口,可以查询出当前在线用户信息。
实现也很简单,也就是查询之前保存 ”用户登录状态的那个去重 set
“即可。
私聊接口
之所以说获取在线用户是一个辅助接口,其实就是用于辅助私聊使用的。
一般我们使用私聊的前提肯定得知道当前哪些用户在线,接着你才会知道你要和谁进行私聊。
类似于这样:
在我们这个场景中,私聊的前提就是需要获得在线用户的 userID
。
所以私聊接口在收到消息后需要查询到接收者所在的 cim-server
实例信息,后续的步骤就和群聊一致了。调用接收者所在实例的 HTTP
接口下发信息。
只是群聊是遍历所有的在线用户,私聊只发送一个的区别。
下线接口
一旦客户端下线,我们就需要将之前存放在 Redis
中的一些信息删除掉(路由信息、登录状态)。
IM 客户端
客户端中的一些逻辑其实在上文已经谈到一些了。
登录
第一步也就是登录,需要在启动时调用 route
的登录接口,获得 cim-server
信息再创建连接。
登录过程中 route
接口会判断是否为重复登录,重复登录则会直接退出程序。
接下来是利用 route
接口返回的 cim-server
实例信息(ip+port
)创建连接。
最后一步就是发送一个登录标志的信息到服务端,让它保持客户端和 Channel
的关系。
自定义协议
上文提到的一些登录报文、真正的消息报文
这些其实都是在我们自定义协议中可以区别出来的。
由于是使用 Google Protocol Buffer
编解码,所以先看看原始格式。
其实这个协议中目前一共就三个字段:
requestId
可以理解为userId
。
reqMsg
就是真正的消息。
type
也就是上文提到的消息类别。
目前主要是三种类型,分别对应不同的业务:
心跳
为了保持客户端和服务端的连接,每隔一段时间没有发送消息都需要自动的发送心跳。
目前的策略是每隔一分钟就是发送一个心跳包到服务端:
这样服务端每隔一分钟没有收到业务消息时就会收到 ping
的心跳包:
内置命令
客户端也内置了一些基本命令来方便使用。
命令 | 描述 |
:q |
退出客户端 |
:olu |
获取所有在线用户信息 |
:all |
获取所有命令 |
: |
更多命令正在开发中。。 |
比如输入 :q
就会退出客户端,同时会关闭一些系统资源。
当输入 :olu
(onlineUser
的简写)就会去调用 route
的获取所有在线用户接口。
群聊
群聊的使用非常简单,只需要在控制台输入消息回车即可。
这时会去调用 route
的群聊接口。
私聊
私聊也是同理,但前提是需要触发关键字;使用 userId;;消息内容
这样的格式才会给某个用户发送消息,所以一般都需要先使用 :olu
命令获取所以在线用户才方便使用。
消息回调
为了满足一些定制需求,比如消息需要保存之类的。
所以在客户端收到消息之后会回调一个接口,在这个接口中可以自定义实现。
因此先创建了一个 caller
的 bean
,这个 bean
中包含了一个
CustomMsgHandleListener
接口,需要自行处理只需要实现此接口即可。
自定义界面
由于我自己不怎么会写界面,但保不准有其他大牛会写。所以客户端中的群聊、私聊、获取在线用户、消息回调等业务(以及之后的业务)都是以接口形式提供。
也方便后面做页面集成,只需要调这些接口就行了;具体实现不用怎么关心。
总结
cim
目前只是第一版,BUG 多,功能少(只拉了几个群友做了测试);不过后续还会接着完善,至少这一版会给那些没有相关经验的朋友带来一些思路。
后续计划:
完整源码: