ajax轮询与websocket

HTTP协议的缺陷

  • 在标准的HTTP请求响应语义中,浏览器发起请求,服务器发送一个响应,这意味着在浏览器发起新请求前,服务器不能发送新信息给客户端浏览器

ajax轮询

  • 轮询:定时的通过Ajax查询服务端
  • 缺点:消息的实时性较差
function sendXHR(obj) {  
    $.ajax({  
        type: "post", //AJAX请求类型  
        url: "你的请求url", 
        timeout: 1000 * 60,  //AJAX请求超时时间为60秒  
        data:obj,
        success: function (data) {  
            // 请求成功的回调函数 
        },
        error: function (data) {  
            // 请求失败的回调函数
        }
    });  
}
window.setInterval(sendXHR(obj),1000); // 实现轮询的重要代码

ajax长轮询

  • 长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。

  • 优点:在无消息的情况下不会频繁的请求,比普通的轮询方式更及时

  • 缺点:会消耗更多的服务器资源,且频繁访问服务器,可能ip会被拉进黑名单

function sendXHR() {  
    $.ajax({  
        type: "post", //AJAX请求类型  
        url: "你的请求url", 
        cache: false,  //无缓存  
        timeout: 1000 * 60,  //AJAX请求超时时间为60秒  
        data:{"key":"value"},
        success: function (data) {  
            // 请求成功的回调函数
            sendXHR();//请求后立即发起AJAX请求  
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {  
            // 请求失败的回调函数
            sendXHR()
        }
    });  
}  

websocket

  • 不管是长轮询还是短轮询,都不太适用于客户端数量太多的情况,因为每个服务器所能承载的TCP连接数是有上限的,这种轮询很容易把连接数顶满
  • 采用 WebSocket 协议后,服务器可以主动推送消息给客户端;而不需要客户端以(长/短)轮询的方式发起http请求到server以获取数据更新反馈
  • WebSockct只需要一次HTTP 握手,整个通讯过程是建立在一次连接(状态)中的,server 端会一直推送消息更新反馈到客户端,直到客户端关闭请求,这样就无需 客户端为发送消息而建立不必要的 tcp 连接 和 为了建立tcp连接而发送不必要的冗余的连接上下文消息
  • 兼容性不好,服务器需要另外配置,客户端实现简单,性能较轮询或长轮询更优,实时性极好
function WebSocketTest() {
        if ("WebSocket" in window) {
            alert("您的浏览器支持 WebSocket!");
            // 打开一个 web socket
            var ws = new WebSocket("ws://localhost:9998/echo");
            ws.onopen = function() {
                // Web Socket 已连接上,使用 send() 方法发送数据
                ws.send("发送数据");
                alert("数据发送中...");
            };
            ws.onmessage = function (event) {
                var received_msg = event.data;
                alert("数据已接收...");
            };
            ws.onclose = function() {
                // 关闭 websocket
                alert("连接已关闭...");
            };
        }
        else {
            // 浏览器不支持 WebSocket
            alert("您的浏览器不支持 WebSocket!");
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值