轮询,长轮询,websocket原理

服务端朝客户端主动推送消息

轮询:效率低,基本不用

让浏览器定时朝后端发送请求(通过ajax向后端偷偷发送数据),比如每隔五秒钟发一次请求,那么你的数据延迟就可能会高达五秒

不足之处
    数据延迟
  消耗资源过大
  请求次数太多

长轮询:兼容性好,一般大公司都会考虑使用它

# 队列+ajax
服务端给每个客户端建立队列,让浏览器通过ajax朝服务端要数据,去各自的队列中获取
如果没有数据则会阻塞但是不会一直阻塞,比如阻塞你30秒,还没有数据则返回,然后让客户端浏览器再次发送请求数据的请求

相对于轮询
    基本是没有消息延迟的
  请求次数降低了很多

# web版本的qq和微信基本上用的都是这么一个逻辑

基于ajax及队列实现长轮询的功能

"""
1.首页自定义用户唯一表示,给每个用户初始化一个队列
2.发送按钮绑定点击事件 后端讲数据放入每一个队列中
3.书写自动获取数据的ajax代码 循环调用
4.前端获取数据DOM操作渲染页面
"""
$(‘#d1‘).click(function () {
        $.ajax({
            url:‘/send_msg/‘,
            type:‘post‘,
            data:{‘content‘:$(‘#d2‘).val()},
            dataType:‘JSON‘,
            success:function (args) {
            }
        })
    });
    function getMsg(){
        $.ajax({
            url:‘/get_msg/‘,
            type:‘get‘,
            data:{‘name‘:‘{{ name }}‘},  // 只要当前登陆人的队列中的数据
            {#dataType:‘JSON‘,#}
            success:function (args) {
                // 针对返回的消息做相应的处理
                if(args.status){
                    // 有消息则渲染页面  讲消息全局放到聊天纪录里面
                    // 1 创建标签
                    var pEle = $(‘<p>‘);
                    // 2 给标签设置文本内容
                    pEle.text(args.msg);
                    // 3 讲创建好的标签添加到聊天记录div标签内
                    $(‘#content‘).append(pEle)
                }else{
                    // 没有消息 则继续发送
                }
                getMsg()  // 循环请求数据
            }
        })
    }
    $(function () {
        getMsg()  // 等待页面加载完毕自动执行
    })

# 后端
# 全局大字典
q_dict = {}  # {‘唯一表示‘:队列,....}

def ab_bl(request):
    # 获取我们自定义的客户端唯一标识
    name = request.GET.get(‘name‘)
    # 给每一个客户端创建一个队列
    q_dict[name] = queue.Queue()
    return render(request,‘ab_bl.html‘,locals())

def send_msg(request):
    if request.method == ‘POST‘:
        # 获取用户发送的消息
        content = request.POST.get(‘content‘)
        # 讲该消息传递给所有的队列
        for q in q_dict.values():
            q.put(content)
        return HttpResponse(‘OK‘)

def get_msg(request):
    name = request.GET.get(‘name‘)
    # 拿到对应的队列
    q = q_dict.get(name)
    # 讲队列中可能有的数据取出并返回给前端浏览器

    # 定义一个字典与ajax进行交互
    back_dic = {‘status‘:True,‘msg‘:‘‘}
    try:
        data = q.get(timeout=10)  # 等10s 没有则直接报错
        back_dic[‘msg‘] = data
    except queue.Empty as e:
        back_dic[‘status‘] = False
    return JsonResponse(back_dic)
    # return HttpResponse(json.dumps(back_dic))

websocket

真正的做到服务端发送消息而不再是被动的发送

目前主流的浏览器都是支持websocket

"""
HTTP协议  网络协议(不加密传输)
HTTPS协议 网络协议(加密传输)
    上面两个协议都是短链接

websocket网络协议  (加密传输)
    浏览器和服务端创建链接之后 默认不再断开
    两端都可以基于该链接收发消息
    websocket的诞生能够真正做到服务端发送消息而不再是被动的发送
"""

websocket内部原理

"""
分成两大部分
    1.握手环节:验证服务端是否支持websocket协议
        先连接服务器

        浏览器产生一个随机字符串 给服务端发送一份(请求头) 自己留一份
        Sec-WebSocket-Key: ePW8kp1XqLNWbJxE/Q38SA==
        服务端和客户端都对随机字符串做下面的操作

        随机字符串 + magic string拼接
        然后再将拼接好的结果进行加密处理(sha1/base64)得到密文

        浏览器自动比对双方产生的密文是否一致,如果一致说明服务端支持websocket
        如果不一致会报错

        假设比对上了 建立websocket链接 基于该链接收发消息

    2.收发数据
        密文传输 >>> 必然要涉及解密(全球统一)的过程
        基于网络传输的数据都是二进制格式 对应到我们python中就是bytes类型

        数据解密过程
            1.先读取数据的第二个字节的后7位(payload)
            根据7位数据的大小来指定不同的解密流程
                =127:再往后读取8个字节
                =126:再往后读取2个字节
                <=125:不再往后读取

            除去前面读取的数据之外 再往后读4个字节(masking-key)
            拿着它去解析后面的真实数据(依据一个计算公式)
"""

原文地址:https://www.cnblogs.com/KrisYzy/p/12332792.html

时间: 2024-10-06 07:27:58

轮询,长轮询,websocket原理的相关文章

Apollo 3 定时/长轮询拉取配置的设计

前言 如上图所示,Apollo portal 更新配置后,进行轮询的客户端获取更新通知,然后再调用接口获取最新配置.不仅仅只有轮询,还有定时更新(默认 5 分钟一次).目的就是让客户端能够稳定的获取到最新的配置. 一起来看看他的设计. 核心代码 具体的类是 RemoteConfigRepository,每一个 Config -- 也就是 namespace 都有一个 RemoteConfigRepository 对象,表示这个 Config 的远程配置仓库,可以利用这个仓库请求远程服务,得到配置

Websocket原理及使用场景[转载]

WebSocket的使用场景 社交聊天.弹幕.多玩家游戏.协同编辑.股票基金实时报价.体育实况更新.视频会议/聊天.基于位置的应用.在线教育.智能家居等需要高实时的场景 由轮询到WebSocket 1 轮询 客户端和服务器之间会一直进行连接,每隔一段时间就询问一次.客户端会轮询,有没有新消息.这种方式连接数会很多,一个接受,一个发送.而且每次发送请求都会有Http的Header,会很耗流量,也会消耗CPU的利用率. 2 长轮询 长轮询是对轮询的改进版,客户端发送HTTP给服务器之后,有没有新消息

python之轮询、长轮询、websocket

轮询 ajax轮询 ,ajax轮询 的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息. 1.后端代码 from flask import Flask,render_template app = Flask(__name__) UUUU = { '1':{'name':'王','count':1}, '2':{'name':'李','count':1}, '3':{'name':'赵','count':1}, } @app.route('/index') def index(

长轮询,websocket

短轮询:server立即响应client的请求 长轮询:server经过一段时间后响应client的请求 长连接:server在响应client的请求之后依然保持连接,client可以使用此连接进行下一次请求 webSocket:以上三种是基于http协议,websocket是新的协议,取消了client和server的概念.上面的三种会多次传送http的header.

轮询、长轮询、长连接、socket连接、WebSocket

轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接. 优点:后端程序编写比较容易. 缺点:请求中有大半是无用,浪费带宽和服务器资源.(而每一次的 HTTP 请求和应答都带有完整的 HTTP 头信息,这就增加了每次传输的数据量) 实例:适于小型应用. 长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接(或到了设定的超时时间关闭连接),客户端处理完响应信息后再向服务器发送新的请求. 优点:在无消息的情况下不会

轮询、长轮询和websocket

一.轮询 在一些需要进行实时查询的场景下应用比如投票系统: 大家一起在一个页面上投票 在不刷新页面的情况下,实时查看投票结果 1.后端代码 from flask import Flask, render_template, request, jsonify app = Flask(__name__) USERS = { 1: {'name': '明凯', 'count': 300}, 2: {'name': '厂长', 'count': 200}, 3: {'name': '7酱', 'coun

Web 通信 之 长连接、长轮询(long polling)(转载)

基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性. 一.什么是长连接.长轮询? 用通俗易懂的话来说,就是客户端不停的向服务器发送请求以获取最新的数据信息.这里的“不停”其实是有停止的,只是我们人眼无法分辨是否停止,它只是一种快速的停下然后又立即开始连接而已. 二.长连接.长轮询的应用场景 长连接.长轮询一般应用与WebIM.ChatRoom和一些需要及时交互的网站应用中.其真实案例有:WebQQ

Web 通信 之 长连接、长轮询(long polling)

基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性. 一.什么是长连接.长轮询? 用通俗易懂的话来说,就是客户端不停的向服务器发送请求以获取最新的数据信息.这里的“不停”其实是有停止的,只是我们人眼无法分辨是否停止,它只是一种快速的停下然后又立即开始连接而已. 二.长连接.长轮询的应用场景 长连接.长轮询一般应用与WebIM.ChatRoom和一些需要及时交互的网站应用中.其真实案例有:WebQQ

Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE

摘要 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯 方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Server-sent Events).本文将简要介绍这4种技术的原理,并指出各自的异同点.优缺点等. 1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询. Comet技术.WebSocket技术.SSE(Server-se