WebSocket介绍

概念

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议

在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。

当你获取 Web Socket 连接后,你可以通过 send()方法来向服务器发送数据,并通过 onmessage 事件来接收服务器返回的数据。

详情:https://www.runoob.com/html/html5-websocket.html

WebSocket实现长连接

连接保持 - Http 发起请求再请求中写一个协议 - WebSocket - 服务器收到Websocket请求 ,自动保持此连接 - 永久不断开,除非主动断开 - 可以通过此连接主动找到客户端

使用方法:

按照第三方包

pip3 install gevent-websocket

导入

from geventwebsocket.handler import WebSocketHandler  # 提供WS协议处理
from geventwebsocket.server import WSGIServer  # 承载服务
from geventwebsocket.websocket import WebSocket  # 语法提示

启动

if __name__ == '__main__':http_serve = WSGIServer(('0.0.0.0', 9527), app, handler_class=WebSocketHandler)http_serve.serve_forever()
不再是之前的app.run()了。

后端操作

user_socket = request.environ.get("wsgi.websocket")  # type:WebSocket
# 这里的# type:WebSocket就是让这个user_socket有WebSocket语法提示
msg = user_socket.receive()
# 接收数据
print(msg)

前端操作(JavaScript)

var ws = new WebSocket("ws://127.0.0.1:9527/my_socket");
// 定义WebSocket连接请求
ws.onmessage = function (eventMessage) {console.log(eventMessage.data);
};

基于WebSocket的实例

群聊(无昵称)

from flask import Flask, request, render_template
from geventwebsocket.handler import WebSocketHandler  # 提供WS协议处理
from geventwebsocket.server import WSGIServer  # 承载服务
from geventwebsocket.websocket import WebSocket  # 语法提示

app = Flask(__name__)user_socket_list = []@app.route("/my_socket")
def my_socket():user_socket = request.environ.get("wsgi.websocket")  # type:WebSocketif user_socket:user_socket_list.append(user_socket)print(len(user_socket_list), user_socket_list)while True:msg = user_socket.receive()print(msg)for u_socket in user_socket_list:try:u_socket.send(msg)except:continue@app.route('/group_chat')
def group_chat():return render_template('群聊.html')if __name__ == '__main__':http_serve = WSGIServer(('0.0.0.0', 9527), app, handler_class=WebSocketHandler)http_serve.serve_forever()

群聊.py

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>群聊</title>
</head>
<body>
<input type="text" id="content">
<button onclick="send_msg()">提交</button><div id="chat_list"></div><script type="application/javascript">var ws = new WebSocket("ws://127.0.0.1:9527/my_socket");ws.onmessage = function (eventMessage) {console.log(eventMessage.data);var p = document.createElement('p');p.innerText = eventMessage.data;document.getElementById('chat_list').appendChild(p);};function send_msg() {var content = document.getElementById('content').value;ws.send(content);}
</script></body>
</html>

群聊.html

群聊(有昵称)

from flask import Flask, request, render_template
from geventwebsocket.handler import WebSocketHandler
from geventwebsocket.server import WSGIServer
from geventwebsocket.websocket import WebSocketapp = Flask(__name__)user_socket_dict = {}@app.route("/my_socket/<username>")
def my_socket(username):user_socket = request.environ.get("wsgi.websocket")  # type:WebSocketif user_socket:user_socket_dict[username] = user_socketprint(len(user_socket_dict), user_socket_dict)while True:msg = user_socket.receive()print(msg)for u_socket in user_socket_dict.values():print(user_socket)try:u_socket.send(msg)except:continue@app.route('/group_chat')
def group_chat():return render_template('有昵称的群聊.html')if __name__ == '__main__':http_serve = WSGIServer(('0.0.0.0', 9527), app, handler_class=WebSocketHandler)http_serve.serve_forever()

群聊2.py

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>昵称群聊</title>
</head>
<body>
设置昵称:<input type="text" id="username">
<button onclick="loginGc()">确定</button>
<br>
<input type="text" id="content">
<button onclick="sendMsg()">提交</button><div id="chat_list"></div><script type="application/javascript">var ws = null;function loginGc() {var username = document.getElementById('username').value;ws = new WebSocket("ws://192.168.16.35:9527/my_socket/" + username);ws.onmessage = function (eventMessage) {console.log(eventMessage.data);str_obj = JSON.parse(eventMessage.data);var p = document.createElement('p');p.innerText = str_obj.from_user + " : " + str_obj.chat;document.getElementById('chat_list').appendChild(p);};}function sendMsg() {var username = document.getElementById('username').value;var content = document.getElementById('content').value;var sendStr = {from_user: username,chat: content};ws.send(JSON.stringify(sendStr));}
</script></body>
</html>

有昵称的群聊.html

私聊

import jsonfrom flask import Flask, request, render_template
from geventwebsocket.handler import WebSocketHandler
from geventwebsocket.server import WSGIServer
from geventwebsocket.websocket import WebSocketapp = Flask(__name__)user_socket_dict = {}@app.route("/my_socket/<username>")
def my_socket(username):user_socket = request.environ.get("wsgi.websocket")  # type:WebSocketif user_socket:user_socket_dict[username] = user_socketprint(len(user_socket_dict), user_socket_dict)while True:msg = json.loads(user_socket.receive())to_user_nick = msg.get('to_user')to_user_socket = user_socket_dict.get(to_user_nick)to_user_socket.send(json.dumps(msg))@app.route('/sl')
def sl():return render_template('私聊.html')if __name__ == '__main__':http_serve = WSGIServer(('0.0.0.0', 9527), app, handler_class=WebSocketHandler)http_serve.serve_forever()

私聊.py

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>私聊</title>
</head>
<body>
设置昵称:<input type="text" id="username">
<button onclick="loginGc()">确定</button>
<br>
给<input type="text" id="to_user">发送<input type="text" id="content">
<button onclick="sendMsg()">发送</button><div id="chat_list"></div><script type="application/javascript">var ws = null;function loginGc() {var username = document.getElementById('username').value;ws = new WebSocket("ws://192.168.16.35:9527/my_socket/" + username);ws.onmessage = function (eventMessage) {console.log(eventMessage.data);str_obj = JSON.parse(eventMessage.data);var p = document.createElement('p');p.innerText = str_obj.from_user + " : " + str_obj.chat;document.getElementById('chat_list').appendChild(p);};}function sendMsg() {var username = document.getElementById('username').value;var to_user = document.getElementById('to_user').value;var content = document.getElementById('content').value;var sendStr = {from_user: username,to_user: to_user,chat: content};ws.send(JSON.stringify(sendStr));}
</script></body>
</html>

私聊.html

转载于:https://www.cnblogs.com/biao-wu/articles/11189144.html

Flask和WebSocket相关推荐

  1. flask+vue+websocket+neo4j+torch模型项目常见报错

    一.vue和flask部分 webpack-dev-server 不是内部或外部命令,也不是可运行的程序 - 删除node_modules 和 npm-shrinkwrap.json - npm sh ...

  2. flask websocket json_Win10环境下使用Flask配合Celery异步推送实时/定时消息/2020年最新攻略...

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_163 首先得明确一点,和Django一样,在2020年Flask 1.1.1以后的版本都不需要所谓的三方库支持,即Flask-Ce ...

  3. python Flask 11 Flas使用gevent-websocket 实现 Websocket

    之前不知道在哪个场合下提到过如何从web后台向前台推送消息.听闻了反向ajax技术这种模式之后,大呼神奇,试了一下之后发现也确实可以用.不过,反向ajax的代价也很明显,只要客户端还和服务端要有信息交 ...

  4. 轮询 长轮询 websocket

    轮询 特点:每隔一段时间不短向后端发送请求 缺点:消耗大,延迟 from flask import Flask,render_template,request,jsonifyapp = Flask(_ ...

  5. websocket协议

    本文摘自:http://www.ruanyifeng.com/blog/2017/05/websocket.html 一.初识websocket 初次接触 WebSocket 的人,都会问同样的问题: ...

  6. python socketio_flask-socketio实现WebSocket的方法

    [flask-socektio] 之前不知道在哪个场合下提到过如何从web后台向前台推送消息.听闻了反向ajax技术这种模式之后,大呼神奇,试了一下之后发现也确实可以用.不过,反向ajax的代价也很明 ...

  7. Python websocket

    一.自己实现websocket 网上流传的都是Python2的websocket实现 # coding=utf8 # !/usr/bin/pythonimport struct, socket imp ...

  8. Web项目之Flask框架

    一.Flask基础 Flask基础之返回值三剑客与form表单提交 Flask基础之session验证与模板渲染语法(jinja2) Flask用户登录之后查看学生信息的小案例 Flask 中内置的 ...

  9. python基于flask_sockets实现WebSocket

    WebSocket是啥? WebSocket是HTML5引入的新的通信协议,主要由Web客户端和服务器实现,当然它也可以在Web之外实现.  与HTTP连接不同,WebSocket连接是客户端和服务器 ...

  10. python基于flask_sockets实现WebSocket——叁

    WebSocket是啥? WebSocket是HTML5引入的新的通信协议,主要由Web客户端和服务器实现,当然它也可以在Web之外实现.  与HTTP连接不同,WebSocket连接是客户端和服务器 ...

最新文章

  1. 使用 Trace32 对 FLASH 编程
  2. msyql 字段说明
  3. AspNetPager7.2的基本使用
  4. Redis 初探-安装与使用
  5. 关于flex布局,我大多数常用的几个点
  6. 【NLP】新分类!全总结!最新Awesome-SLU-Survey资源库开源!
  7. edge如何导入html文件收藏夹,edge浏览器收藏夹如何导入?edge浏览器收藏夹导入方法...
  8. 自注意力机制Self-attention(1)
  9. 16.对极几何——介绍,立体视觉约束,条件_1
  10. (C语言)人名排序,字符串排序
  11. 在vs.net实现向导式窗口_萨满佳作赏析 | 精神世界,灵魂向导,力量动物(1)...
  12. iOS UIWebView 之 UIProgressView
  13. 自己试着在阿里云布了个服务器
  14. Atitit.软件开发的最终的设计 dsl化,ast化(建立ast, 解析执行ast)
  15. protel常用元件封装大全
  16. 【汇编实战开发笔记】80x86汇编基础的三大块知识
  17. 人物连连看 python课程设计 pygame学习
  18. SAP会计借贷(转载)
  19. 百钱买百鸡,​ 我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。​ 百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
  20. Android APP的签名

热门文章

  1. 178. Rank Scores
  2. 如何动态读取嵌入式资源
  3. Docker入门者手册
  4. 简单php网站的mysql优化小结
  5. LoadRunner启动自带例子Web Tours报错
  6. SharePoint 2010新体验9 - 内容管理器(Content Organizer)
  7. java获取结果集_Java-如何获取结果集上的列名
  8. SVN 更新发生冲突各选项含义
  9. webpack 保存文件后自动打包_Webpack轻松入门(二)——CSS打包
  10. 机械臂拉格朗日动力学怎么用matlab仿真_Matlab 机器人动力学参数辨识仿真(1)单摆的动力学参数辨识...