项目开发之消息推送与强制下线

需求:实现消息推送与强制下线

刚搜索这个需求的时候网上出现了一堆的推送服务。于是就想着调第三方库去实现,如极光推送。后来考虑到第三方库存在安全性问题或者可能某天这个第三方软件就不提供支持了,就改用了WebSocket来自己实现消息推送。

关于服务端如何使用websoket,可以看我的这一篇博文:点击打开链接

当使用websocket通信的时候,移动端与后台的交互过程是这样的。

1、移动端必须先登录。在登录验证用户名和密码通过后,才允许移动端接着发起websocket连接。

2、移动端向服务器发起Websocket连接,在连接成功的时候会将用户的用户标识放到一个HashMap里,这个HashMap用来保存到不同的websocket连接 ,如Map users;map的键是用户的标识,值是这个用户连接的WebScoketSession

出现的问题

这里出现了一个问题使我迷惑了很久:在实现强制下线的时候,当用户在移动端第二次登录账号的时候会把自己给踢下线。

为什么会出现这个问题呢:经过多次查找和debug我终于发现了问题所在:在websocket连接成功的时候,我使用用户的userid作为不同用户的标识存在保存WebSocketSession的HashMap中。在相同用户第二次登录(拥有相同的userid)的时候,会把保存在Map中已经存在的键为"userid"的用户的值替换掉。这时候第二个用户登录成功后会把下线的消息发给键为"userid"的用户,就这样把自己给踢下线了。

解决办法:相同的账号登录也应该要有不同的键来标识:可以使用"userid+ip地址"来标识每一次登录的账号,每次账号登录成功后,都会给保存WebSocketSession的map种键是"userid"但ip地址不同的账号发送下线消息,移动端收到这种消息,马上弹出退化框,并强制下线。

关于移动端怎么配置

Android端也需要导入JavaWebSocket_fat.jar包,这个包封装了发起WebScocket连接、消息通信的方法。详情请见:点击打开链接


WebSocket协议简介

有了http协议为什么还需要websockeet协议?

1、http协议的通信只能由客户端发起,当客户端需要获取服务端的状态变化时,需要不断的”轮询”。而轮询是非常浪费资源且效率低下。

2、Websocket协议是基于TCP协议的。它可以实现客户机和服务器之间的双向通信,客户机可以向服务器发送消息,服务器也可以主动向客户机发送消息。

Websocket的优点:

1、websocket协议通信时,头部信息小,数据格式轻量级,通信高效。

2、http协议兼容好,握手的时候使用HTPP协议,不容易被HTTP代理服务器屏蔽。

3、Websocket使用长连接,进行通信的时候只需要进行一次连接便可以进行多次消息通信。

4、双向通信!!






你可能感兴趣的:(Web开发)