HTTP长轮询(long polling)实现
来源:互联网 发布:豆瓣知乎天涯的区别 编辑:程序博客网 时间:2024/05/22 06:09
一,轮询,长轮询
轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。
优点:后端程序编写比较容易。
缺点:请求中有大半是无用,浪费带宽和服务器资源。
实例:适于小型应用。
长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
优点:在无消息的情况下不会频繁的请求,耗费资源小。
缺点:服务器hold连接会消耗资源,返回数据顺序无保证,难于管理维护。
实例:WebQQ、Hi网页版、Facebook IM。
二,实现步骤
1.逻辑图
2.代码
public class UserServiceImpl implements UserService {private final Logger logger = LoggerFactory.getLogger(this.getClass());private Map<String,LoginQRcode> mp = new HashMap<>(); @Overridepublic JSONObject createQrCode(String qrCode){LoginQRcode loginQRcode = new LoginQRcode(qrCode,LoginQRcode.STATE1,null);mp.put(qrCode, loginQRcode);return new JSONObject();}@Overridepublic JSONObject bindUserInfoToQrcode(String qrCode, String uid, Integer userType)throws CustomException{LoginQRcode loginQRcodeCache = mp.get(qrCode);synchronized(loginQRcodeCache){loginQRcodeCache.setState(LoginQRcode.STATE2);loginQRcodeCache.setUid(uid);loginQRcodeRepository.save(loginQRcodeCache);//更新value值mp.put(qrCode, loginQRcodeCache);loginQRcodeCache.notifyAll();return new JSONObject();}}@Overridepublic JSONObject getUserInfoByQrId(String qrId) throws CustomException{LoginQRcode loginQRcodeCache = mp.get(qrId);synchronized(loginQRcodeCache){if(loginQRcodeCache.getState() == LoginQRcode.STATE1){ try { loginQRcodeCache.wait(3*60*1000); } catch (InterruptedException e) {e.printStackTrace(); } }String uid = loginQRcodeCache.getUid();if(uid == null){throw new CustomException(CustomException.OPERATION_FAIL);}User user = getUser(uid);JSONObject jsonObject = getUserInfo(uid);return jsonObject;} }}
0 0
- HTTP长轮询(long polling)实现
- 长轮询(long-polling)
- Web通信之:长轮询(long-polling)
- 用 ASP.NET MVC 实现基于 XMLHttpRequest long polling(长轮询) 的 Comet
- 基于AJAX的长轮询(long-polling)方式实现简单的聊天室程序
- 基于AJAX的长轮询(long-polling)方式实现简单的聊天室程序
- 基于AJAX的长轮询(long-polling)方式实现COMET例子
- Comet:基于 HTTP 的long-polling技术
- Long Polling (Comet4j)推送
- 基于Ajax的长轮询(long-polling)方式
- Web 通信 之 长连接、长轮询(long polling)
- Web 通信 之 长连接、长轮询(long polling)
- Web 通信 之 长连接、长轮询(long polling)
- Web 通信 之 长连接、长轮询(long polling)
- Web 通信 之 长连接、长轮询(long polling)
- Web 通信 之 长连接、长轮询(long polling)
- Web 通信 之 长连接、长轮询(long polling)
- Web 通信 之 长连接、长轮询(long polling)
- 手机QQ公众号亿级消息实时群发架构
- 2-9-扩展的线性单链表(带头结点)-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版
- C#中的WebBrowser控件的使用
- iOS 教你写单例
- 分解质因数
- HTTP长轮询(long polling)实现
- 蓝条下压和消失导致页面错乱问题解决方案
- 我理想中的《研发部项目开发流程》
- mybatis框架的两种分页
- 实验2 不带头节点的单链表
- 关于error:Cannot assign to 'self' outside of a method in the init family
- spring mvc 上传文件
- 纯Lua实现的位操作
- webbrowser指定显示网页的位置然后API实现模拟人工点击