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
原创粉丝点击