完成客户端与服务端的消息通讯,建立长连接,消息发送,断线重连等相关处理
长连接:走socket
IP 42.192.43.3
端口: 8020

logic:(设备注册)走grpc
IP 42.192.43.3
端口: 50001

客户端socket框架采用mars,适合移动端
文档:https://github.com/Tencent/mars/wiki
DEMO示例:
https://github.com/Tencent/mars/tree/master/samples


通讯协议采用pb
android版本的grpc接入:
https://github.com/grpc/grpc-java

IOS版本的grpc接入:
https://github.com/grpc/grpc

参考FLUTTER客户端项目FIM(主要理解与服务端交互的过程)
https://codeup.teambition.com/q/fim


客户端本地使用Sqlite数据库

消息是IM中最主要的数据,消息的收取是协议栈自动处理,消息收取后自动存储在数据库中。因此从数据库中读取消息和会话是当时最新的状态。此外需要监听新消息回调,收到新消息后重新从数据库中读取或者更新之前读取的数据即可。

群组信息,群成员信息,用户信息,好友信息等,这类信息变更没有推送功能,因此需要在合适的时机去服务器刷新。这类信息的获取一般都是带有一个从服务器强制刷新参数refresh。数据不存在或者refresh为true时,协议栈会强制去网络刷新,如果数据有变动会发出通知。在应用中需要考虑信息取回来是空的可能,另外需要监听对应信息刷新事件。


客户端接入流程(具体可以参考fim项目)

1.调用LogicExt.RegisterDevice接口,完成设备注册,获取设备ID(device_id),注意,一个设备只需完成一次注册即可,后续如果本地有device_id,就不需要注册了,举个例子,如果是APP第一次安装,就需要调用这个接口,后面即便是换账号登录,也不需要重新注册。
2.调用UserExt.SignIn接口,完成账户登录,获取账户登录的token。(共用原来系统账号登陆的token)
3.建立长连接,使用步骤2拿到的token,完成长连接登录。
如果是web端,需要调用建立WebSocket时,将user_id,device_id,token,以URL参数的形式传递到服务器,完成长连接登录,例如:ws://localhost:8081/ws?user_id={user_id}&device_id={device_id}&token={token}
如果是APP端,就需要建立TCP长连接,在完成建立TCP长连接时,第一个包应该是长连接登录包(SignInInput),如果信息无误,客户端就会成功建立长连接。
4.使用长连接发送消息同步包(SyncInput),完成离线消息同步,注意:seq字段是客户端接收到消息的最大同步序列号,如果用户是换设备登录或者第一次登录,seq应该传0。
接下来,用户可以使用LogicExt.SendMessage接口来发送消息,消息接收方可以使用长连接接收到对应的消息。