写在前面
在上一篇文章跟我一起开发商业级IM(1)——技术选型及协议定义中,我们完成了技术选型,回顾一下:
通信协议
- TCP
- WebSocket
传输协议
- Protobuf
- Json
通信框架
- Netty
接下来,我们基于上述的协议与框架,分别来实现Android客户端
与Java服务端
的接口定义及封装,在这个阶段,只需要定义接口及适当封装即可,暂不需要具体实现。
由于篇幅原因,只能贴出核心部分的代码。在后续的文章中,也是以文字+部分核心代码的方式讲解,如果需要完整代码,请移步Github。
贴个Kula高清图镇楼:
本文只讲述接口的定义及封装,至于实现会在后续的文章中会分篇讲解。
分析一下,我们的IM Service(下文简称IMS)应该有如下接口:
- 初始化
- 连接
- 重连
- 断开连接
- 发送消息
- 释放资源
那我们来开始封装吧。
接口定义
这一步比较简单,先定义一个IMSInterface
,在其中编写一些接口方法,然后分别实现NettyTCPIMS
和NettyWebSocketIMS
。
/**
* @author FreddyChen
* @name IMS抽象接口,不同的客户端协议实现此接口即可
*/
public interface IMSInterface {
}
/**
* @author FreddyChen
* @name Netty TCP IM Service,基于Netty实现的TCP协议客户端
*/
public class NettyTCPIMS implements IMSInterface {
private NettyTCPIMS() { }
public static NettyTCPIMS getInstance() {
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder {
private static final NettyTCPIMS INSTANCE = new NettyTCPIMS();
}
}
/**
* @author FreddyChen
* @name Netty WebSocket IM Service,基于Netty实现的WebSocket协议客户端
*/
public class NettyWebSocketIMS implements IMSInterface {
private NettyWebSocketIMS() { }
public static NettyWebSocketIMS getInstance() {
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder {
private static final NettyWebSocketIMS INSTANCE = new NettyWebSocketIMS();
}
}
如上,接口定义完成,接下来我们来分别定义具体的方法(方法实现在后续文章会讲解)。
初始化
一款优秀的SDK应该具备可配置、易扩展等特性,分析一下,我们不难发现IMS应该需要支持大量的参数配置,比如:
- 通信协议(TCP/WebSocket)
- 传输协议(Protobuf/Json)
- 连接超时时间
- 重连间隔时间
- 服务器地址
- 心跳前后台间隔时间
- 是否自动重发消息
- 消息最大重发次数
- 消息重发间隔时间
等,以上参数都不应该在IMS内部固定,IMS可以提供默认值,同时支持应用层(调用方)去配置。可见支持配置的参数非常多,如果都单独作为参数传递过来,那可读性会非常差,这种情况我们可以利用“Builder模式(构建者模式,也可称为建造者模式)”来优化一下,所以初始化的接口方法可以定义为:
/**
* 初始化
*
* @param context
* @param options IMS初始化配置
* @param connectStatusListener IMS连接状态监听
* @param msgReceivedListener IMS消息接收监听
*/
void init(Context context, IMSOptions options, IMSConnectStatusListener connectStatusListener, IMSMsgReceivedListener msgReceivedListener);
/**
* @author FreddyChen
* @name IMS初始化配置项
*/
public class IMSOptions {
private CommunicationProtocol communicationProtocol;// 通信协议
private TransportProtocol transportProtocol;// 传输协议
private int co