zoukankan      html  css  js  c++  java
  • http轮询,长轮询

    轮询,长轮询

    轮询

    • 轮询:客户端定时向服务器发送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;
        }
    
    }
    
    
  • 相关阅读:
    scrapy+Lucene搭建小型搜索引擎
    普通程序员如何转向AI方向
    python:单引号,双引号和三引号
    【推荐】你必须知道的EF知识和经验
    Quartz.NET 入门
    论如何学习一门编程语言
    Android解析ActivityManagerService(一)AMS启动流程和AMS家族
    python的数据可视化库 matplotlib 和 pyecharts
    pythonWeb -- Django开发- Admin
    Android内存优化(四)解析Memory Monitor、Allocation Tracker和Heap Dump
  • 原文地址:https://www.cnblogs.com/frankltf/p/11410831.html
Copyright © 2011-2022 走看看