轮询,长轮询 轮询 轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。 优点:后端程序编写比较容易。 缺点:请求中有大半是无用,浪费带宽
轮询,长轮询
轮询
- 轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。
- 优点:后端程序编写比较容易。
- 缺点:请求中有大半是无用,浪费带宽和服务器资源。
- 实例:适于小型应用。
长轮询
- 长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
- 优点:在无消息的情况下不会频繁的请求,耗费资源小。
- 缺点:服务器hold连接会消耗资源,返回数据顺序无保证,难于管理维护。
- 实例:WebQQ、Hi网页版、Facebook IM。
//web客户端代码如下: function longPolling(){ $.ajax({ async : true,//异步 url : 'longPollingAction!getMessages.action', type : 'post', dataType : 'json', data :{}, timeout : 30000,//超时时间设定30秒 error : function(xhr, textStatus, thrownError) { longPolling();//发生异常错误后再次发起请求 }, success : function(response) { message = response.data.message; if(message!="timeout"){ broadcast();//收到消息后发布消息 } longPolling(); } }); } //web服务器端代码如下 public class LongPollingAction extends BaseAction { private static final long serialVersionUID = 1L; private LongPollingService longPollingService; private static final long TIMEOUT = 20000;// 超时时间设置为20秒 public String getMessages() { long requestTime = System.currentTimeMillis(); result.clear(); try { String msg = null; while ((System.currentTimeMillis() - requestTime) < TIMEOUT) { msg = longPollingService.getMessages(); if (msg != null) { break; // 跳出循环,返回数据 } else { Thread.sleep(1000);// 休眠1秒 } } if (msg == null) { result.addData("message", "timeout");// 超时 } else { result.addData("message", msg); } } catch (Exception e) { e.printStackTrace(); } return SUCCESS; } public LongPollingService getLongPollingService() { return longPollingService; } public void setLongPollingService(LongPollingService longPollingService) { this.longPollingService = longPollingService; } }