Socket.IO框架
-
简介
Socket.IO 本是一个面向实时 web 应用的 JavaScript 库,现在已成为拥有众多语言支持的Web即时通讯应用的框架。
Socket.IO 主要使用WebSocket协议。但是如果需要的话,Socket.io可以回退到几种其它方法,例如Adobe Flash Sockets,JSONP拉取,或是传统的AJAX拉取,并且在同时提供完全相同的接口。尽管它可以被用作WebSocket的包装库,它还是提供了许多其它功能,比如广播至多个套接字,存储与不同客户有关的数据,和异步IO操作。
Socket.IO 不等价于 WebSocket,WebSocket只是Socket.IO实现即时通讯的其中一种技术依赖,而且Socket.IO还在实现WebSocket协议时做了一些调整。
优点:
Socket.IO 会自动选择合适双向通信协议,仅仅需要程序员对套接字的概念有所了解。
有Python库的实现,可以在Python实现的Web应用中去实现IM后台服务。
缺点:
Socket.io并不是一个基本的、独立的、能够回退到其它实时协议的WebSocket库,它实际上是一个依赖于其它实时传输协议的自定义实时传输协议的实现。该协议的协商部分使得支持标准WebSocket的客户端不能直接连接到Socket.io服务器,并且支持Socket.io的客户端也不能与非Socket.io框架的WebSocket或Comet服务器通信。因而,Socket.io要求客户端与服务器端均须使用该框架。
注意:
解释:Socket.IO拥有众多语言支持的Web即时通讯应用的框架。 需要注意的几个问题: 1.Socket.IO 不等价于 WebSocket, 并不是简单的对WebSocke进行了封装。 2.如果选择了Socket.IO框架,前后端都要使用。不能单方使用。 3.Socket.IO框架是基于事件处理的。
-
安装
pip install python-socketio
-
创建服务器
-
方式1
使用多进程多线程模式的WSGI服务器对接(如uWSGI、gunicorn)
import socketio # create a Socket.IO servers sio = socketio.Server() # 打包成WSGI应用,可以使用WSGI服务器托管运行 app = socketio.WSGIApp(sio) # Flask Django
创建好app对象后,使用uWSGI、或gunicorn服务器运行此对象。
-
方式2
作为Flask、Django 应用中的一部分
from wsgi import app # a Flask, Django, etc. application import socketio # create a Socket.IO server sio = socketio.Server() app = socketio.WSGIApp(sio, app)
创建好app对象后,使用uWSGI、或gunicorn服务器运行此对象。
-
方式3
使用协程的方式运行 (推荐)
import eventlet eventlet.monkey_patch() import socketio import eventlet.wsgi sio = socketio.Server(async_mode='eventlet') # 指明在evenlet模式下 app = socketio.Middleware(sio) eventlet.wsgi.server(eventlet.listen(('', 8000)), app)
说明
方式1: 使用多进程多线程模式的WSGI服务器对接 缺点: 一个进程或者一个线程维护一个客户端连接,太耗服务器资源。效率低,并发低。 方式2: 作为Flask、Django 应用中的一部分 缺点: 跟方式1一样会遇到同样的问题 方式3: 使用协程的方式运行 (推荐) 优点: 可以提升即时通信服务器的性能。 备注: 1.协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。 2.协程执行效率高。因为子程序切换不是线程切换,而是由程序自身控制,没有线程切换的开销,所以和多线程比,协程的执行效率更高。而且,并发越高,协程的性能优势就越明显。
-
-
事件处理
编写事件处理方法,可以接收指定的事件消息数据,并在处理方法中对消息数据进行处理。