该程序主要是第三方短信服务商与联通网关的通信程序,其短信收发包主要应用了IO开源框架netty,该程序主要将短信内容组装成联通通信协议中规定的格式,然后发送给联通网关,然后在通过联通发送给用户以提供短信业务。先分析收发通信模块
一,基本流程
1.发送客户端首先会链接并发送登录协议包登录联通网关
client.connectAndLogin(); 方法主要工作便是链接并登录,链接和登录会反复尝试,直到链接成功并登录
链接方法
登录方法,发送登录包CMPP30Connect登录
提交包 submitPacket 将包体中的byte 流写入session
二.组包过程
每类消息实体都继承于一个抽象消息类,这个消息类中主要的两个方法分别是write,read
- write 在发送出去的消息中,将实体中的成员属性有字符串根据协议组装为byte流,发送类消息包含
CMPP30Connect ,CMPP30Deliver,CMPP30Submit
- read 在返回的消息中,将接收的byte流解析为消息实体中对应的成员属性,返回消息包含 CMPP30ConnectResp,
CMPP30DeliverResp,CMPP30SubmitResp
消息类结构运用了典型的模板模式,抽象类write,read 定义组包,解析包的固有流程,如下抽象类中的read,write方法
其中对包头的处理writeHeader,readHeader,每类消息都是一样的,可以在抽象类中实现,writeHeader,readHeader的实现,
而writeBody,readBody则在个具体消息子类中根据每类消息的组包协议不同来具体实现
在消息子类CMPP30Connect ,CMPP30DeliverResp中writeBody, readBody的实现
组包的详细细节
以CMPP30Submit消息体为例详细讲解下组包的详细细节
定义消息体中每个成员属性在消息包中所在空间大小,即所占的字节长度,这是协议中规定死的,
消息体中的成员属性
消息体中组包方法的细节说明 writeBody
在这个消息体中 msg_id 没有为空,所以他所占用的空间用0来填充。
这几个成员属性是int类型,直接转换为byte填充进buffer缓存区中。
字符串类型的可通过getBytes方法来转换