`

python使用websocket的几种方式

阅读更多

      websocket 是一种html5新的接口,以前服务器推送需要进行ajax等方式进行轮训,对服务器压力较高,随着新标准的推进,使用websocket在推送等方面已经是比较成熟了,并且各个浏览器对websocket的支持情况已经比较好了,只要不是太老古古董,对这些暂时不考虑。

使用websocket的时候,前端使用是比较规范的,js支持ws协议,感觉上类似于一个轻度封装的socket协议,只是以前需要自己维护socket的连接,现在能够以比较标准的方法来进行。
总的来说因为前端是js,所以后端对websocket支持最好的是socket.io,在搜索websocket相关的内容的时候感觉socket.io对这个的推广也是不少的,但是现在使用的是python,因为新学习python
事件不长,各个框架都在接触一点还是有好处了。

常用框架:

  • uwsgi
  • flask
  • tornado
  • django

下面几个都是一个回音壁程序,也就是接受前端js发过来的websocket信息,然后将websocket再原路返回
前端js:

1
2
3
4
5
6
var s = new WebSocket("%s://%s/foobar/");
s.onopen = function() {}
s.onmessage = function(e) {}
s.onerror = function(e) {}
s.onclose = function(e) {}
s.send(value);

 

这几条就是常用的js使用websocket的代码,处理逻辑没有写,要看完整的看下面uwsgi的官方给的例子,我基本上是照搬的。连接回掉,获取信息回掉,错误回掉,关闭回掉,以及发送信息

uwsgi

官方文档已经很好了,第一个成功执行的websocket程序就是uwsgi,然后才慢慢的前端不变,然后后端找其他的方案,官方给的例子也是简单易懂的,例子在websockets_chat_async.py,从这个例子来看,只用uwsgi,需要维护太多的内容,html与python混在一起实在不太好看,所幸这个例子足够简单。

flask-uwsgi-websocket

flask-uwsgi-websocket

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from flask import Flask, request, render_template
from flask.ext.uwsgi_websocket import GeventWebSocket
app = Flask(__name__)
ws = GeventWebSocket(app)
@app.route('/')
def index():
return render_template('index.html')
@ws.route('/foobar')
def echo(wscon):
msg = wscon.receive()
if msg is not None:
wssss.send(msg)
if __name__ == '__main__':
app.run(gevent=100)

 

这里使用flask自带python容器进行执行python web
从上面代码可以看到,使用很简单,其余部分跟普通的flask都没有区别,只需要在需要更改websocket的url请求修饰符,修饰符的来源是:

1
ws = GeventWebSocket(app)

 

很简单也很强大,前端库因为逻辑不需要更改,所以感觉挺好的,但是这个库Flask-uWSGI-WebSocket好像有个bug,在用这个库的时候,前端js持续接收到空的消息然后触发了onmessage回掉函数,在使用同样的前端js,其他后端库的时候没有这个问题。

geventwebsocket

geventwebsocket

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from flask import Flask, request, render_template, abort
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
 
app = Flask(__name__)
 
@app.route('/')
def index():
return render_template('index.html')
 
@app.route('/foobar')
def echo():
if request.environ.get('wsgi.websocket'):
ws = request.environ['wsgi.websocket']
if ws is None:
abort(404)
else:
while True:
if not ws.closed:
message = ws.receive()
ws.send(message)
 
 
if __name__ == '__main__':
http_server = WSGIServer(('',5000), app, handler_class=WebSocketHandler)
http_server.serve_forever()

 

这段代码同样使用了flask来进行模板,url之类的解析,不同之处是不再使用flask自带的容器,而是当作一个应用,被gevent里的一个uwsgiserver容器来调用。
而与普通使用方法不同的是注入了handler_class这个类,替换成websocket类型的,具体实现还没有看,但是从逻辑上可以理解,原来的wsgiserver不理解websocket,所以换一个理解websocket的类来进行处理,
所以在foobar的程序中才可以从request的环境变量里获取websocket连接,从这里来看,websockethandler也对websocket连接进行了维护工作,简化了很多工作。

需要注意的是,这个库当前最新版本是0.9.5,网上搜到了一个教程,但是它的版本针对的是0.3.5版本的,这个库的维护者还进行了变更,其中有些api好像有了变化,需要注意。

tornado

tornado_websocket文档
文档已经很全面了,就不贴代码了
优点,回掉方式,在异步化之后,并发处理能力应该不错,因为是原生支持websocket而不像flask需要寻找第三方插件,所以可能更值得信赖
官方给的一个聊天室的例子就很好tornado_chatroom,坑比前面两个flask的少。值得推荐

dwebsocket

dwebsocket
官方的没什么坑,django的一个插件,处理websocket,在django这个同步阻塞的库里给了websocket的方法。确实值得推荐,暂时不知道是怎么绕过django的同步阻塞的,有时间了看看它的代码,反正好像代码量也不多的样子。

1
2
3
4
5
6
7
8
9
10
11
from django.shortcuts import render
from dwebsocket import require_websocket
 
def index(request):
return render(request, 'index.html')
 
@require_websocket
def foobar(request):
while True:
message = request.websocket.wait()
request.websocket.send("return: "+ message)

 

跟flask的第一个库一样,都是只需要添加一个修饰符就可以了。

总结

折腾了一天多的时间。个人比较感兴趣的几个python的websocket的使用,算是搞通了,至少自己不管是照搬还是适配,总算是能用了。
uwsgi感觉比较原始的控制html,控制返回,独自使用好像不太方便,实际上第一个flask的例子后端应该就是使用uwsgi的,从它的名字就可以看到。
Flask-uWSGI-WebSocket和dwebsocket的方式类似,只是一个用于flask,一个用于django,但是前者有个不大不小的bug,给人感觉不太成熟的样子,后者倒是感觉不错,对于django来说,挺不错的样子,不过django的1.9版本出来了一个通道功能,用于执行类似于websocket的后台长时间的功能,找时间了解下,不过这个功能好像还是插件式提供的语句在,好像在下一个django会合到主分支版本的样子,文档在:
Django Channels
tornado是一个新兴的异步框架,了解的不多,感觉上跟flask和django不太一样。但是可以作为利器使用,新手就不多说了。

 

分享到:
评论

相关推荐

    python实现websocket的客户端压力测试

    为了有效地进行 WebSocket 客户端的压力测试,我们需要考虑以下几个方面: 1. **连接建立**:客户端连接到服务器的过程。 2. **消息发送与接收**:客户端向服务器发送消息,并接收服务器响应。 3. **并发控制**:...

    详解python websocket获取实时数据的几种常见链接方式

    ### 详解Python WebSocket 获取实时数据的几种常见链接方式 在当今快速发展的互联网世界中,实时数据传输变得尤为重要。WebSocket作为一种高效、低延迟的双向通信协议,被广泛应用于各种场景,如股票交易系统、在线...

    Python-Websockify是一个WebSocket至TCP的代理桥梁

    WebSocket是一种在客户端和服务器之间建立长连接的协议,它可以提供双向通信,即服务器和客户端都能主动发送数据。 Websockify的核心功能是将WebSocket请求转换为TCP连接,并将TCP响应转发回WebSocket客户端。这样...

    python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)

    在本实例中,我们将探讨如何使用Python的Websocket库创建一个简单的聊天工具,结合JavaScript作为客户端,实现双向通信。Websocket是一种在客户端和服务器之间建立持久连接的技术,允许双方实时交换数据。 首先,...

    用python实现的websocket代码.docx

    具体来说,有以下几种情况: 1. **长度小于125**:直接在Payload Length字段中表示长度。 2. **长度在126至65535之间**:Payload Length设置为126,随后跟随着两个字节表示实际长度。 3. **长度在65536至2^64-1之间...

    Python Websocket服务端通信的使用示例

    下面我们将深入探讨Python中使用Websocket服务端的示例: 1. **创建WebSocket服务器** Python中的`websockets`库提供了一个方便的API来创建WebSocket服务器。在示例中,首先导入所需的库`asyncio`和`websockets`,...

    高分项目基于Python和WebSocket的实时语音通信系统源码+项目说明.zip

    该项目是一个使用Python编程语言和WebSocket协议实现的实时语音通信系统,非常适合用于课程设计或毕业设计。WebSocket是一种在客户端和服务器之间建立长连接的协议,它允许双向通信,即服务器和客户端都可以主动发送...

    python实现的websocket代码.docx

    根据提供的文档信息,我们可以深入探讨Python中WebSocket协议的实现细节,特别是关注于如何解析和处理WebSocket数据帧。本文将从以下几点展开: 1. **WebSocket帧格式解析**:包括帧类型的定义及其作用。 2. **数据...

    用python实现的websocket代码.pdf

    WebSocket是一种在客户端和服务器之间建立持久连接的协议,允许双方实时、双向地交换数据。Python作为一门广泛应用的编程语言,提供了多种库来实现...同时,不同的WebSocket库也可能有不同的API设计和使用方式。

    WebSocket区分不同客户端两种方法(HttpSession和@PathParam)

    另一种常用的方法是通过在WebSocket连接URL中传递参数的方式进行识别,即使用`@PathParam`注解。这种方式相对简单,适用于不需要长期维护会话状态的场景。 ##### 2. 实现步骤 **步骤一:定义连接URL** 首先,在...

    基于websocket协议的简易视频直播

    WebSocket协议是一种在客户端和服务器之间建立长连接的协议,它为双向通信提供了低延迟、高效的数据传输方式。在传统的HTTP协议中,每次请求-响应都需要重新建立连接,而WebSocket则在连接建立后可以保持长时间打开...

    websocket向指定用户发信息

    WebSocket是一种在客户端和服务器之间建立持久连接的协议,它允许双方进行全双工通信,即数据可以在任意方向上同时传输。这种技术对于实时性要求高的应用,如在线聊天、游戏、股票交易等非常有用,因为它避免了HTTP...

    WebSocketTest_websocket_websocketserver_服务器_

    WebSocket服务器通常由以下几个关键组件构成: 1. **连接建立**:客户端首先通过HTTP升级请求与服务器建立WebSocket连接。这个请求携带特定的头部信息,例如"Upgrade: websocket"和"Connection: Upgrade",以及一个...

    WebsocketDemo.zip

    1. **服务器端代码**:通常使用Node.js、Java(例如Spring Boot)、Python(如Flask-SocketIO)或其他支持WebSocket的后端框架编写。服务器端代码会创建WebSocket服务,并监听客户端的连接请求,处理发送和接收的...

    h5websocket.zip

    WebSocket API是HTML5引入的一种新的通信协议,它的目标是为web应用提供低延迟、全双工的通信方式。传统的HTTP协议在请求-响应模式下效率较低,不适合实时性要求高的应用场景,如在线聊天、股票交易、多人在线游戏等...

    websocket实现聊天记录

    在"WebSocket实现聊天记录"这个主题中,我们需要理解以下几个关键知识点: 1. **WebSocket协议基础**:WebSocket协议定义了一种在单个TCP连接上进行全双工通信的协议。与HTTP协议不同,WebSocket协议一旦建立连接,...

    websocket群发和指定用户发消息spring boot练习

    本练习项目是基于Spring Boot实现WebSocket功能,主要涉及以下几个知识点: 1. **Spring Boot集成WebSocket**:首先,我们需要在Spring Boot项目中引入`spring-boot-starter-websocket`依赖,它提供了WebSocket的...

Global site tag (gtag.js) - Google Analytics