HTTP长轮询(long polling)实现

一,轮询,长轮询

轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。 
优点:后端程序编写比较容易。 
缺点:请求中有大半是无用,浪费带宽和服务器资源。 
实例:适于小型应用。

长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。 
优点:在无消息的情况下不会频繁的请求,耗费资源小。 
缺点:服务器hold连接会消耗资源,返回数据顺序无保证,难于管理维护。 
实例:WebQQ、Hi网页版、Facebook IM。

二,实现步骤

1.逻辑图

HTTP长轮询(long polling)实现_第1张图片

2.代码

public class UserServiceImpl implements UserService {

	private final Logger logger = LoggerFactory.getLogger(this.getClass());
	
	private Map mp = new HashMap<>();

                 @Override
	public JSONObject createQrCode(String qrCode){
		LoginQRcode loginQRcode = new LoginQRcode(qrCode,LoginQRcode.STATE1,null);
		mp.put(qrCode, loginQRcode);
		return new JSONObject();
		
	}
	
	@Override
	public  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();
		}	
	}
	@Override
	public  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;
		}
    }

}



你可能感兴趣的:(HTTP长轮询(long polling)实现)