HTTP长连接实现服务端实时推送消息的小例子,同个账号重复登录踢出原先登录的账号

本文介绍了使用HTTP长连接和长轮询实现服务端实时推送消息,以解决重复登录时踢出旧账号的问题。通过轮询机制,保持客户端与服务端的连接状态,提高消息推送效率。同时,利用sessionID作为唯一标识,在已登录用户映射中管理消息队列,新登录账号可定向推送给旧账号,旧账号通过长连接实时获取并处理消息。
摘要由CSDN通过智能技术生成

           HTTP本质是由客户端发起请求获取数据,要实现服务端推送消息,最简单的方式是利用ajax不断的轮询,间隔设置越小实时性越高,同时对服务器的压力越大。如果服务端产生消息的间隔比轮询间隔大很多的话,很多请求都是落空的,感觉有点浪费。自然想到使用长轮询的方式改进,请求到达服务端,当有消息的时候立即返回,并再发起一个请求,如果没有消息,则保持连接一段时间,比如30秒,然后重新发起请求。 这样请求的间隔根据消息产生的频率有个最大30秒弹性的间隔,并且能保证消息的实时推送。从fiddler抓包来看,每个客户端一直有个http连接和服务端处于连接状态,(ps:在网上看长连接和长轮询,iframe方式ajax方式,一直搞不清区别,我都认为一致了)。

         要实现账号重复登录踢出原先登录的账号,则需要定向推送消息,如何找到原先登录的客户端?需要找一个客户端连接唯一的标识,比如sessionid,每个客户端登录后,注册到已登录map中,并且对应生成一个消息队列。 后来登录的账户只要在已登录map中找到sessionid,然后往sessionid对应的消息队列推送消息,每个客户端保持的长连接实时从自己对应的消息队列中poll消息,然后执行相应的操作就行了。

        流程图:

         代码:

public class LoginServlet extends HttpServlet{
	@Override
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		ServletContext context = this.g
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值