3.长轮询
2022/5/22 23:06:59
本文主要是介绍3.长轮询,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
长轮询: 当服务器收到前端发来的请求后,服务器端不会直接进行响应,而是先将这个请求挂起,然后判断服务器端数据是否有更新。如果有更新,则进行响应, 如果一直没有数据,则到达一定的时间限制(服务器端设置)才返回,返回完之后,客户端再次建立连接,周而复始,基于事件的触发,一个事件接一个事件 长轮询处理流程: 1.访问接口地址的时候,后端为每个用户创建一个队列 2.前端发送内容,数据发送到后天,将数据存储到每个人的队列中 3.前端递归获取消息,去自己的队列中获取数据,然后在界面上显示//前端 <script> USER_UID = "{{ uid }}"; // 发送数据 function sendMessage() { var text = $("#txt").val(); // 基于ajax将用户输入的文本信息发送到后台 $.ajax({ url: '/pool/send/msg/', type: 'GET', data: { text: text } }) } // 获取数据 function getMessage() { $.ajax( { url: '/pool/get/msg', type: 'GET', dataType: 'JSON', data: { uid: USER_UID, }, success: function (res) { if (res.status) { var tag = $("div"); tag.text(res.data) $("#message").append(tag); } // 递归调用 getMessage(); } } ) } $(function (){ getMessage(); }) </script>
# views from django.shortcuts import render, HttpResponse from django.http.response import JsonResponse import queue # Create your views here. # 创建用户队列 USER_QUEUE = {} def home(request): # 获取当前访问用户uid uid = request.GET.get('uid') # 用户访问的时候,将当前用户存储到队列 USER_QUEUE[uid] = queue.Queue() return render(request, 'home.html', {'uid': uid}) def send_msg(request): # 获取用户发送到内容 text = request.GET.get('text') for uid, q in USER_QUEUE.items() q.put(text) return HttpResponse('ok') def get_msg(request): # 当前用户uid uid = request.GET.get('uid') # 获取当前用户队列 q = USER_QUEUE[uid] # 设置返回值 result = {'status': True, 'data': None} try: # 如果获取到数据,将数据传给 result['data'],队列超时时间为10s data = q.get(timeout=10) result['data'] = data except queue.Empty as e: # 如果10s没有新数据,将status设置为False返回 result['status'] = False # 前端可以通过status 判断有没有新数据 return JsonResponse(result)Q:服务端持有连接,服务器压力是不是很大? A:如果基于IO多路复用 + 异步,可以解决这个问题
这篇关于3.长轮询的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-27JavaScript面试真题详解与解答
- 2024-12-27掌握JavaScript大厂面试真题:新手入门指南
- 2024-12-27JavaScript 大厂面试真题详解与解析
- 2024-12-26网络攻防资料入门教程
- 2024-12-26SQL注入资料详解:入门必读教程
- 2024-12-26初学者指南:数据库服务漏洞项目实战
- 2024-12-26网络安全项目实战:新手入门指南
- 2024-12-26网络攻防项目实战入门教程
- 2024-12-26信息安全项目实战:从入门到初步应用
- 2024-12-26SQL注入项目实战:初学者指南