[002]MPUSH消息推送系统开发教程第2篇-服务端监听客户端上线、下线、发送消息到客户端

    MPUSH开源推送系统官网[https://mpusher.github.io]

    MPush作为一个实时消息推送系统。

    举一个场景,某手机客户端接收不到服务端推送的消息,需要我们排查原因。

    一、从如下步骤入手排查。

1、该手机客户端是否上线?如果是则步骤2;
2、服务端是否发送消息到客户端?
3、发送结果如何?

        带着这个问题,我们看下消息推送正常流程。

    二、消息推送正常流程

1、客户端向服务端建立TCP长链接;
2、客户端向服务端绑定用户ID;
3、服务端向客户端发送消息,获得发送结果。

接下来我们调试一下程序。

    三、调试步骤

步骤1、启动ServerTestMain长链接服务(服务端)
步骤2、启动AllocServerMainTest调度器(alloc)

步骤3、打开MPushAndroid,填写Alloc服务器地址( http://103.60.220.145:9999/ ),

                    注意以http://开头,且加端口号,点击Start。

    四、逻辑分析

    1、当调度器(alloc)启动的时候,服务端接收到调度器alloc链接的信息,如下图:

       [002]MPUSH消息推送系统开发教程第2篇-服务端监听客户端上线、下线、发送消息到客户端_第1张图片

        注意:服务端IP与端口信息 L:/172.31.64.234:3001,端口是3001。

    2、服务端监听客户端上线

    当客户端向服务端建立连接的时候,服务端接收到客户端上线消息,日志如下:

        [002]MPUSH消息推送系统开发教程第2篇-服务端监听客户端上线、下线、发送消息到客户端_第2张图片

        注意:服务端IP与端口信息 L:/172.31.64.234:3000,端口是3000;客户端IP与端口信息 R:/172.31.98.77:55971。

    3、服务端向客户端发送消息、发送结果

            服务端发送消息到客户端,看下发送结果。

           在浏览器输入:http://127.0.0.1:9999/index.html,点击发送,界面弹出“服务已经开始推送,请注意查收消息”。

           我们不相信页面的结果,我们看下发送日志:

            [002]MPUSH消息推送系统开发教程第2篇-服务端监听客户端上线、下线、发送消息到客户端_第3张图片

        说明:这个日志是alloc调度器打印的日志,因为上面这个demo是在调度器调用mpush-client(服务端SDK)发送消息的。发送方法有个Callback的方法,返回发送结果。

        这时候,我们再看服务端的日志:

19:43:01.204 -[push]- [SingleUserPush] push message to client success, timeLine=TimeLine[3](ms){push-center-begin --(0ms) --> before-send --(3ms) --> success-end}, message=GatewayPushMessage{userId='user-0', clientType='1', timeout='2500', content='183'}

        也显示了发送结果。

    4、服务端监听客户端下线

         如果客户端下线了,通过心跳,服务端可以监听到客户端下线的消息,日志如下:

        20:43:54.277 - [mp-event-p-1-t-1] INFO  - com.mpush.common.user.UserManager - user offline user-0

        截图如下:

      [002]MPUSH消息推送系统开发教程第2篇-服务端监听客户端上线、下线、发送消息到客户端_第4张图片

    五、总结

        消息推送系统,跟发短信、发邮件、发微信其实是一样原理的。

    1、短信发送服务,业务系统调用第三方短信网关接口,短信网关会同步返回发送结果到业务系统,

        如果发送失败了,业务系统会重试。

    2、邮件发送服务,业务系统调用邮件SDK,实现发送功能,返回发送结果。

    3、消息推送系统,调用SDK发送消息时,返回发送结果,如果失败了,尝试N次,如果还是失败,则保存为离线消息。

    4、至于消息是否丢失了,客户端是否读取到了消息,服务端可以不用太关注,只管发送方结果就可以了,

        这样服务端和客户端的业务就解耦了。

你可能感兴趣的:(技术类,MPUSh)