Flask 中使用 WebSocket 通信

WebSocket 是一种计算机通信协议,通过单个 TCP 连接提供全双工通信信道。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API 中,客户端和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

在 Flask 中使用 flask-sockets 实现 WebSocket 通信。

Flask-Sockets 官方地址 https://github.com/heroku-python/flask-sockets

1 入门示例

Flask 通过 flask-sockets 实现一个回声服务器作为示例(客户端发送什么数据,服务端就原样返回什么数据,就像回声一样)。

服务端示例:

pip3 install flask
pip3 install flask-sockets

flask_socket_demo.py 为服务端代码:

from flask import Flask
from flask_sockets import Sockets


app = Flask(__name__)
sockets = Sockets(app)


@sockets.route('/echo')
def echo_socket(ws):
    while not ws.closed:
        message = ws.receive()
        ws.send(message)


@app.route('/')
def hello():
    return 'Hello World!'


if __name__ == "__main__":
    from gevent import pywsgi
    from geventwebsocket.handler import WebSocketHandler
    server = pywsgi.WSGIServer(('127.0.0.1', 5000), app, handler_class=WebSocketHandler)
    server.serve_forever()

python3 实现 websocket 客户端示例:

pip3 install websocket-client

websocket_client_demo.py 为客户端代码:

from websocket import create_connection


def main():
    url = 'ws://127.0.0.1:5000/echo'
    ws = create_connection(url)
    print("获取连接状态:", ws.connected)

    ws.send("Hello")
    response = ws.recv()
    print("获取服务器返回的结果: ", response)
    ws.close()


if __name__ == '__main__':
    main()

2 使用 Flask blueprints 示例

from flask import Flask, Blueprint
from flask_sockets import Sockets


html = Blueprint(r'html', __name__)
ws = Blueprint(r'ws', __name__)


@html.route('/')
def hello():
    return 'Hello World!'


@ws.route('/echo')
def echo_socket(socket):
    while not socket.closed:
        message = socket.receive()
        socket.send(message)


app = Flask(__name__)
sockets = Sockets(app)

app.register_blueprint(html, url_prefix=r'/')
sockets.register_blueprint(ws, url_prefix=r'/')


if __name__ == "__main__":
    from gevent import pywsgi
    from geventwebsocket.handler import WebSocketHandler
    server = pywsgi.WSGIServer(('127.0.0.1', 5000), app, handler_class=WebSocketHandler)
    server.serve_forever()

3 补充

The websocket interface that is passed into your routes is provided by gevent-websocket. The basic methods are fairly straightforward — send, receive, send_frame, and close.

flask-sockets 是基于 gevent-websocket 实现的,使用的协程。如果接口中使用 time.sleep() 会阻塞进程,得用 gevent.sleep() 来进行切换使其他协程运行。

举个例子,有一个 http 轮询接口,浏览器每秒向服务端发送一次请求获取数据,那改造为 websocket 后,客户端与服务端建立连接后,客户端不再重复请求服务端了,服务端使用 gevent.sleep(1) 每隔一秒主动向客户端发送一次数据。

@sockets.route('/hello')
def echo_socket(ws):
    message = socket.receive()	# 接收客户端的数据
    while not ws.closed:
        ws.send('hello')		# 向客户端发送数据
        gevent.sleep(1)			# 不能使用 time.sleep(1), 否则会阻塞协程的运行
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
WebSocket通信的工具是一种在Web应用程序实现实时双向通信的技术。它能够提供长连接,并允许服务器主动向客户端推送数据,而无需客户端发起请求。以下是几种常用的WebSocket通信工具: 1. Socket.io:Socket.io是一种基于Node.js的实时通信库,提供了跨平台的双向通信。它支持WebSocket并且兼容旧版浏览器,还可以自动选择最佳通信方式(WebSocket、flash或HTTP轮询)以确保最佳性能。Socket.io还提供了丰富的事件和API,使得实时通信的开发变得简单和可靠。 2. SignalR:SignalR是微软开发的实时通信框架,允许服务器端和客户端之间进行实时双向通信。它支持WebSocket以及其他传输方式(如Server-Sent Events和Long Polling),并且可以在多种平台上进行开发,包括ASP.NET、ASP.NET Core和JavaScript。 3. SockJS:SockJS是一种JavaScript库,它提供了WebSocket的封装,可以在不支持WebSocket的浏览器使用其他传输方式(如AJAX轮询)来实现实时通信。SockJS具有跨浏览器兼容性,并且可以与WebSocket搭配使用以提供更好的性能和效果。 4. WebSockets.org:WebSockets.org是一个开源的WebSocket库和资源集合,提供了各种不同语言和平台的WebSocket实现。它包括了代码示例、文档、教程等内容,可以帮助开发者更轻松地使用WebSocket进行通信。 这些工具都提供了一种简单且高效的方式来实现WebSocket通信,使得开发者能够快速构建实时的Web应用程序。通过利用WebSocket的长连接特性,可以实现即时的数据更新、聊天功能、实时协作等多种实时应用场景。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值