WebSocket

WebSocket 是一种 在单个tcp链接上进行全双工通信的协议。
让客户端和服务器之间的数据交换变得简单, 允许服务端主动向客户端推送数据。
浏览器和服务器只需要完成一次握手, 两者之间就直接可以创建持久性的链接, 并进行双向数据传输。

轮询推送技术,浏览器需要向服务器发HTTP请求, 然后服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,
既浏览器需要不断的向服务器发请求,然而真正的有效数据只有很小的一部分,显然会浪费带宽。

在这种情况下,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
优点, 较少的控制开销。 先创建连接,保持连接状态。

实现WebSocket连接

from geventwebsocket.server import WSGIServer # 我要WSGI为我提供服务
from geventwebsocket.handler import WebSocketHandler # WSGI遇到ws协议的时候,处理方式
from geventwebsocket.websocket import WebSocket # 语法提示用

基于Flask + geventwebsocket

from flask import Flask, request

实例化flask

app = Flask(name)

@app.route("/ws")
def my_ws_func():
# print(dir(request.environ))
user_socket = request.environ.get("wsgi.websocket") # type:WebSocket
# web + socket
print(user_socket)
while 1:
msg = user_socket.receive() # 接收 ,等客户端发消息
print(msg)
user_socket.send(msg)

"""['class', 'contains', 'delattr', 'delitem', 'dir', 'doc', 'eq', 'format', 'ge', 'getattribute', 'getitem', 'gt', 'hash', 'init', 'init_subclass', 'iter', 'le', 'len', 'lt', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'setitem', 'sizeof', 'str', 'subclasshook', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']"""

启动

if name == 'main':
# app.run()
http_ser = WSGIServer(("0.0.0.0", 9878), application=app, handler_class=WebSocketHandler)
http_ser.serve_forever()

原文地址:https://www.cnblogs.com/asdlo/p/10456957.html