HTTP长轮询(long polling)实现

本文介绍了HTTP长轮询的工作原理和优缺点。在轮询方式中,客户端定时发送Ajax请求,服务器立即响应并关闭连接,可能导致资源浪费。而长轮询则在有新数据时才返回响应,降低了资源消耗,适用于WebQQ、Facebook IM等应用场景。文章还涵盖了长轮询的实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,轮询,长轮询

轮询:客户端定时向服务器发送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<>();

                 @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;
		}
    }

}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值