Gevent-socketio文档-Socket.IO的一个python实现

Gevent-socketio 是一个基于 Python 的实时通信框架,它提供了一个抽象的 Socket.IO 接口,支持多种传输协议,包括 websocket、flashsocket、htmlfile 等。该框架旨在与各种基于 WSGI 的 Web 开发框架无缝集成,简化实时应用的开发过程。通过使用 Gevent-socketio,开发者可以轻松地在网页间实现实时消息传递、文件同步等功能,同时利用命名空间和事件处理机制来组织和管理实时活动。

原文链接 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,你可以实现自己的命名空间机制。

  • 命名事件

为了处理那些来来往往的消息,你也许会很想给他们命名。在这里也一样,如果不使用Socket.IO,你可以有自己的任务命名方式管理你的数据包。在Socket.IO6.0或一般版本中,你可以使用一个保留字来序列化一个JSON对象(我用 {"type": "submit_something"})。7.0实现了命名事件,它吧数据放在一个简单的(线性、串行、类似于麻雀在电线上的?)表单内。它允许你定义回调函数,回调函数会被其他终端通知触发,并返回一些参数。对于牛逼的 RPC,想要用的话,就自己实现吧。

  • 传输协议

Socket.IO最主要的特点就是对传输协议的抽象,它甚至能使用长轮询的方式来支持 IE6的实时连接,对于新的浏览器,它还支持更高效的原生websocket。目前支持的协议有:websocket , flashsocket , htmlfile , xhr-multipart , xhr-polling , jsonp-polling。
这个实习,用事件和回调重写了几乎所有的Socket.IO0.7+的传输协议。并且,它还增加了ACLs(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"


这里,使用  socketio.socketio_manage() 来启动Socket.IO服务进程,并处理链接。

你会碰到一个“Socket”的概念,这是一个对其他类似于长轮询或有状态传输协议的抽象,并且提供了统一的接口。在Socket内部,你可以定义很多命名空间,并且每一个都会被名称所限制,例如/chat 、 /filesystem /foobar。需要注意的是,还存在一个全局的命名空间,它用空字符串定义。有时,全局命名空间中会有一些特殊功能,用来向前兼容(0.6版本我们只有一个命名空间)。类如,断开全局命名空间,意味着,所有的连接都会被断开。而断开某个非全局命名空间,只会删除对当前命名空间的访问。

Socket是负责打包的,在命名空间内部或Socket对象里,它们开起来大概是这个样子:

{"type": "event",
 "name": "launch_superhero",
 "args": ["Superman", 123, "km", {"hair_color": "brown"}]}

当轮到他们传输的时候,这些包会被序列化到一个紧密的表单中,Socket.IO在大量长轮询传输中会使用一些优化方案。

说到这里,如果你还不了解Gevent,你最好是了解它一下,因为他是你工作的基础:

http://www.gevent.org/


  • 入门

额,在我们有成熟的教程之前,就先凑合着看demo和API文档吧。

你还可以看个视频:

http://pyvideo.org/video/1573/gevent-socketio-cross-framework-real-time-web-li

如何建立自己的命名空间,请参阅:

socketio.namespace

针对不同服务器的整合:

Server integration layers

  • 例子

有几个小栗子,在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是我们用来测试不同功能的应用程序,有一对更先进的使用案例
pyvore 是一个为服务器开发的用来进行实时聊天会议的应用:

  • 安全

它有个ACL,使用的例子是:
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文档

API文档比较详细,希望你能通过文档了解它的一切。

从你的框架中使用Gevnt-socket的管理器是:

命名空间是开发者主要使用的部分,如果你想自定义命名空间来映射请求,请参阅:

Mixins是一个你可以添加到命名空间的元件,它可以提供更多功能:

Sockets是一个抽象的虚拟传输接口,它是一个实现了发送/接收功能命名空间:

Handler是一个底层的传输处理器,它负责调用你的WSGI程序:

socketio.handler


Transports负责将不同的反向机制传输给Socket,了解更多和反向机制,请参阅:

socketio.transports


Server是用来把gevent和WSGI服务挂钩到WSGI应用的元件,它可以派发任何的Socket.IO相关的动作到handlertransports

socketio.server


自动索引:

索引

模块索引


  • 参考文献、贡献者及其他:

https://gevent-socketio.readthedocs.org/en/latest/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值