原文链接 https://gevent-socketio.readthedocs.org/en/latest/
- 简介
Socket.IO是一个可以让浏览器与服务器实现实时通信的类Websocket的抽象。Gevent-socket是Socketio协议的一个python实现。
参考LearnBoost开发的Node.js的Socket.IO服务器端实现,现在已经有多种语言的Socket.IO server实现了。
这个项目的目的之一是实现一个可以运行在各种基于WSGI的web开发框架(例如Pyramid, Pylons, Flask, web2py, Django...)之上的以gevent为基础的统一API。只需要大约3行代码就可以把它配置到你的框架里。【注意:】使用gevent-socket ,需要使用gevent python WSGI服务器。
- 命名空间
因为很有肯能在你的每个站点上都有一个websocket终端,所以,对于网站不同的页面或不同的部分有不同的实时活动命,名空间是很重要的。就像你通过路由器吧url映射到不同的功能代码一样。Socket.IO 0.7+的命名空间是另一个很受欢迎的命名空间,如果不适用Socket.IO,你可以实现自己的命名空间机制。
- 命名事件
- 传输协议
- 概念
为了便于大家读懂下面的文章,我们先解释一些术语:
“命名空间”就像MVC里的控制器,它包含了一组含有逻辑的方法,例如,send_private_message事件会在/chat命名空间内, kick_ban事件也是。而scan_files事件会在/filesystem命名空间内。每个命名空间都有一个 BaseNamespace的子类代表。下面是一个简单的栗子:
客户端
varsocket=io.connect("/chat");
服务器(这是一个 Pyramid 的栗子,其他框架也是一样的)
from socketio.namespace import BaseNamespace
class ChatNamespace(BaseNamespace):
def on_chat(self, msg):
self.emit('chat', msg)
def socketio_service(request):
socketio_manage(request.environ, {'/chat': ChatNamespace},
request)
return "out"
你会碰到一个“Socket”的概念,这是一个对其他类似于长轮询或有状态传输协议的抽象,并且提供了统一的接口。在Socket内部,你可以定义很多命名空间,并且每一个都会被名称所限制,例如/chat 、 /filesystem 或 /foobar。需要注意的是,还存在一个全局的命名空间,它用空字符串定义。有时,全局命名空间中会有一些特殊功能,用来向前兼容(0.6版本我们只有一个命名空间)。类如,断开全局命名空间,意味着,所有的连接都会被断开。而断开某个非全局命名空间,只会删除对当前命名空间的访问。
Socket是负责打包的,在命名空间内部或Socket对象里,它们开起来大概是这个样子:
{"type": "event",
"name": "launch_superhero",
"args": ["Superman", 123, "km", {"hair_color": "brown"}]}
当轮到他们传输的时候,这些包会被序列化到一个紧密的表单中,Socket.IO在大量长轮询传输中会使用一些优化方案。
说到这里,如果你还不了解Gevent,你最好是了解它一下,因为他是你工作的基础:
- 入门
额,在我们有成熟的教程之前,就先凑合着看demo和API文档吧。
你还可以看个视频:
http://pyvideo.org/video/1573/gevent-socketio-cross-framework-real-time-web-li
如何建立自己的命名空间,请参阅:
针对不同服务器的整合:
- 例子
有几个小栗子,在https://github.com/abourget/gevent-socketio/tree/master/examples上。
- simple_chat是简单的聊天室应用程序
- simple_pyramid_chat是整合在pyramid中的一个简单的聊天应用程序
- live_cpu_graph是一个简单的实时CPU监控(仅限Linux)
- twitter_stream是Twitter的更新
- pyramid_backbone_redis_chat是使用backbone.js和Redis的用于发布订阅pyramid的应用程序
- pyramid_backbone_redis_chat_persistence是一个pyramid的应用程序使用backbone.js,Redis的用于发布订阅和持久性功能
- TestApp是我们用来测试不同功能的应用程序,有一对更先进的使用案例
- 安全
class AdminInterface(BaseNamespace):
def get_initial_acl(self):
"""Everything is locked at first"""
return []
def initialize(self):
# This here assumes you have passed in a `request`
# to your socketio_manage() call, it has that
# `is_admin` attribute
if not request.is_admin:
return
else:
self.lift_acl_restrictions()
def on_blahblahblah(self, data):
"""This can't be access until `lift_acl_restrictions()` has
been called
"""
pass
- API文档
Handler是一个底层的传输处理器,它负责调用你的WSGI程序:
Transports负责将不同的反向机制传输给Socket,了解更多和反向机制,请参阅:
Server是用来把gevent和WSGI服务挂钩到WSGI应用的元件,它可以派发任何的Socket.IO相关的动作到handler和 transports
自动索引:
Gevent-socketio 是一个基于 Python 的实时通信框架,它提供了一个抽象的 Socket.IO 接口,支持多种传输协议,包括 websocket、flashsocket、htmlfile 等。该框架旨在与各种基于 WSGI 的 Web 开发框架无缝集成,简化实时应用的开发过程。通过使用 Gevent-socketio,开发者可以轻松地在网页间实现实时消息传递、文件同步等功能,同时利用命名空间和事件处理机制来组织和管理实时活动。
475

被折叠的 条评论
为什么被折叠?



