一,轮询,长轮询
轮询:客户端定时向服务器发送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;
}
}
}