js 长轮询_websocket挂载到vue上

js 长轮询_websocket挂载到vue上引入Web端即时通讯技术:即时通讯技术简单的说就是实现这样一种功能:服务器端可以即时地将数据的更新或变化反应到客户端,例如消息即时推送等功能都是通过这种技术实现的。但是在Web中,由于浏览器的限制,实现即时通讯需要借助一些方法。这种限制出现的主要原因是,一般的Web通信都是浏览器先发送请求到服务器,服务器再进行响应完成数据的现实更新。实现Web端即时通讯的方法:实现即时通讯主要有四种方式,它们分别…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

引入

Web端即时通讯技术:即时通讯技术简单的说就是实现这样一种功能:服务器端可以即时地将数据的更新或变化反应到客户端,例如消息即时推送等功能都是通过这种技术实现的。但是在Web中,由于浏览器的限制,实现即时通讯需要借助一些方法。这种限制出现的主要原因是,一般的Web通信都是浏览器先发送请求到服务器,服务器再进行响应完成数据的现实更新。

实现Web端即时通讯的方法:实现即时通讯主要有四种方式,它们分别是轮询、长轮询(comet)、长连接(SSE)、WebSocket。它们大体可以分为两类,一种是在HTTP基础上实现的,包括短轮询、comet和SSE;另一种不是在HTTP基础上实现是,即WebSocket。下面分别介绍一下这四种轮询方式,以及它们各自的优缺点。

当我们要实现一个实时投票系统,或者是实时通讯系统,我们的页面数据总需要更新

我们不能让用户一直去刷新页面。所以就有了轮询,长轮询,以及websock的出现

轮询

既然我想要实时获取后端的数据,那我就每隔2秒给后端发一次请求

这种我们就叫轮询~那它会有一些缺点就是存在延时~就算每秒发一次~也会存在一定的延迟

下面我们看下轮询的代码:

from flask import Flask, render_template, request, jsonify

app = Flask(__name__)

USERS = {

1: {“name”: “悟空”, “count”: 0},

2: {“name”: “悟能”, “count”: 0},

3: {“name”: “悟净”, “count”: 0},

}

@app.route(“/”)

def index():

return render_template(“index.html”, users=USERS)

@app.route(“/vote”, methods=[“POST”])

def vote():

uid = request.json.get(“uid”)

USERS[uid][“count”] += 1

return “投票成功”

@app.route(“/get_vote”)

def get_vote():

return jsonify(USERS)

if __name__ == ‘__main__’:

app.run()

app.py

Title

选丑大赛

{% for key, value in users.items()%}

{
{value.name}} ({
{value.count}})

{% endfor %}

function vote(uid) {

axios.request({

url: “/vote”,

method: “POST”,

data: {

“uid”: uid

}

}).then(function (res) {

console.log(res.data)

})

}

function get_vote() {

axios.request({

url: “/get_vote”,

method: “GET”

}).then(function (res) {

console.log(res)

for(let key in res.data){

let liEle = document.getElementById(key);

let username = res.data[key][“name”]

let count = res.data[key][“count”]

liEle.innerText = `${username} (${count})`

}

})

}

window.onload = function () {

setInterval(get_vote, 2000)

}

index.html

长轮询

轮询缺点就是延迟,那么如果前端发送过来请求,如果没有数据的更新

后端的请求就阻塞了,直到有数据返回或者超时再返回,这样延迟就可以得到很好的解决

python中有个queue对象,当我们从这个队列里拿不到值的时候,可以阻塞住请求的

import queue

from flask import Flask

app = Flask(__name__)

q = queue.Queue()

@app.route(“/get”)

def index():

try:

val = q.get(timeout=20)

except queue.Empty:

val = “超时”

return val

@app.route(“/vote”)

def vote():

q.put(“10”)

return “投票成功”

if __name__ == ‘__main__’:

app.run()

queueDemo.py

如果我为每个请求都建立一个q对象,然后阻塞住他们的请求,有数据更新的时候,给他们的q对象返回值就可以了。

from flask import Flask, render_template, request, jsonify, session

import queue

import uuid

app = Flask(__name__)

app.secret_key = “lajdgia”

USERS = {

1: {“name”: “悟空”, “count”: 0},

2: {“name”: “悟能”, “count”: 0},

3: {“name”: “悟净”, “count”: 0},

}

# 为每个用户建立一个q对象

# 以用户的uuid为key 值为q对象

Q_DICT = {}

@app.route(“/”)

def index():

user_uuid = str(uuid.uuid4())

session[“user_uuid”] = user_uuid

Q_DICT[user_uuid] = queue.Queue()

return render_template(“index2.html”, users=USERS)

@app.route(“/vote”, methods=[“POST”])

def vote():

# 投票 循环q对象的dict 给每个q对象返回值

uid = request.json.get(“uid”)

USERS[uid][“count”] += 1

for q in Q_DICT.values():

q.put(USERS)

return “投票成功”

@app.route(“/get_vote”, methods=[“POST”, “GET”])

def get_vote():

# 获取投票结果 去自己的q对象里取值 没有夯住 知道有或者超时返回

user_uuid = session.get(“user_uuid”)

q = Q_DICT[user_uuid]

try:

users = q.get(timeout=30)

except queue.Empty:

users = “”

return jsonify(users)

if __name__ == ‘__main__’:

app.run()

app2.py

Title

选丑大赛

{% for key, value in users.items()%}

{
{value.name}} ({
{value.count}})

{% endfor %}

function vote(uid) {

axios.request({

url: “/vote”,

method: “POST”,

data: {

“uid”: uid

}

}).then(function (res) {

console.log(res.data)

})

}

function get_votes() {

axios.request({

url: “/get_vote”,

method: “POST”

}).then(function (res) {

console.log(res);

if(res.data != “”){

for(let key in res.data){

let liEle = document.getElementById(key);

let username = res.data[key][“name”]

let count = res.data[key][“count”]

liEle.innerText = `${username} (${count})`

}

}

get_votes()

})

}

window.onload = function () {

get_votes()

}

index2.html

websocket

websocket是一个协议,协议规定

连接的时候需要握手,发送的数据需要加密~~连接之后不断开

Flask不带websocket,我们需要下载

下载:pip install gevent-websocket

from flask import Flask, request, render_template

from geventwebsocket.handler import WebSocketHandler

from gevent.pywsgi import WSGIServer

import json

app = Flask(__name__)

USERS = {

1: {“name”: “悟空”, “count”: 0},

2: {“name”: “悟能”, “count”: 0},

3: {“name”: “悟净”, “count”: 0},

}

@app.route(“/”)

def index():

return render_template(“index3.html”, users=USERS)

WEBSOCKET_LIST = []

@app.route(“/vote”)

def vote():

ws = request.environ.get(“wsgi.websocket”)

if not ws:

return “HTTP请求”

WEBSOCKET_LIST.append(ws)

while True:

uid = ws.receive()

if not uid:

WEBSOCKET_LIST.remove(ws)

ws.close()

break

uid = int(uid)

USERS[uid][“count”] += 1

name = USERS[uid][“name”]

new_count = USERS[uid][“count”]

for client in WEBSOCKET_LIST:

client.send(json.dumps({“uid”: uid, “name”: name, “count”: new_count}))

if __name__ == ‘__main__’:

http_server = WSGIServer((‘127.0.0.1’, 5000), app, handler_class=WebSocketHandler)

http_server.serve_forever()

app3.py

Title

选丑大赛

{% for (key, value) in users.items() %}

{
{value.name}} ({
{value.count}})

{% endfor%}

let ws = new WebSocket(‘ws://127.0.0.1:5000/vote’)

function vote(uid) {

ws.send(uid)

}

ws.onmessage = function (event) {

let data = JSON.parse(event.data);

let liEle = document.getElementById(data.uid);

liEle.innerText = `${data.name} (${data.count})`

}

index3.html

作  者:Warm and new

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/182049.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • matlab读取txt文件数据_matlab怎么输入数据

    matlab读取txt文件数据_matlab怎么输入数据文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件。MATLAB提供了一系列低层输入输出函数,专门用于文件操作。1、文件的打开与关闭1)打开文件在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为:fid=fopen(文件名,‘打开方式’)说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0

    2025年9月19日
    7
  • 国产Linux操作系统(深度系统)增加了微软Microsoft Edge浏览器(Linux版本)

    国产Linux操作系统(深度系统)增加了微软Microsoft Edge浏览器(Linux版本)深度商店应用更新记录汇总(2021-11)新增应用序号 状态 应用分类 应用名称 应用类型 1 上架 网络应用 迪普SSLVPN Linux 2 上架 影像编辑 浩辰CAD2022 Linux 3 上架 影像编辑 中望建筑CAD设计软件(ForLinux)V2022 Linux 4 上架 效率办公 腾讯文档 Linux 5 上架 系统工具

    2022年10月5日
    2
  • CSS样式表的引入方式

    CSS样式表的引入方式CSS初识CSS(CascadingStyleSheets)美化样式CSS通常称为CSS样式表或层叠样式表(级联样式表),主要用于设置HTML页面中的文本内容(字体、大小、对齐方式等)、图片的外形(宽高、边框样式、边距等)以及版面的布局等外观显示样式。CSS以HTML为基础,提供了丰富的功能,如字体、颜色、背景的控制及整体排版等CSS的优点1.内容与表现分离。2.网页的表现统一,容易修改。3.丰富的样式,使得页面布局更加灵活4.减少网页的代码量,增加网页的浏览速度。5.运用独立于页面

    2022年7月14日
    18
  • 画完三角形再画谢尔宾斯基地毯

    画完三角形再画谢尔宾斯基地毯照样废话不说,看代码看注释importjava.awt.Color;importjava.awt.Dimension;importjava.awt.Graphics;importjava.awt.Toolkit;importjava.awt.event.MouseAdapter;importjava.awt.event.MouseEvent;import…

    2022年7月13日
    16
  • MySQL执行顺序

    mysql执行顺序

    2022年4月6日
    44
  • 喊山第二部_喊山主演

    喊山第二部_喊山主演原题链接喊山,是人双手围在嘴边成喇叭状,对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤。呼唤声通过空气的传递,回荡于深谷之间,传送到人们耳中,发出约定俗成的“讯号”,达到声讯传递交流的目的。原来它是彝族先民用来求援呼救的“讯号”,慢慢地人们在生活实践中发现了它的实用价值,便把它作为一种交流工具世代传袭使用。(图文摘自:http://news.xrxxw.com/newsshow-8018.html)一个山头呼喊的声音可以被临近的山头同时听到。题目假设每个山头最多有两个能听到它的临近山头。给定任意一个发

    2022年8月8日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号