class socketio.Middleware(socketio_app, wsgi_app=None, socketio_path='socket.io')
用于Socket.IO的WSGI中间件。
此中间件将流量分派到 Socket.IO
应用程序(application),并可选地将常规HTTP流量转发给WSGI应用程序。
socketio_app # Socket.IO服务端
wsgi_app # 接收所有其他流量的WSGI应用程序。
socketio_path # 应该安装Socket.IO应用程序的端点。默认值适用于大多数情况。
import socketio
import eventlet
from . import wsgi_app
sio = socketio.Server()
app = socketio.Middleware(sio, wsgi_app)
eventlet.wsgi.server(eventlet.listen(('', 8000)), app) // 这里是监听端口
二、socketio.Server
初始化Server
class socketio.Server(client_manager=None, logger=False, binary=False, json=None, async_handlers=False, **kwargs)
一个Socket.IO服务端。
这个类实现了完全兼容的Socket.IO Web服务器,支持websocket和long-polling传输。
client_manager # 将管理客户端列表的客户端管理器实例。当这被省略时,客户列表被存储在内存中的结构中,所以不能使用多个连接的服务端。
logger # 启用日志记录设置True或传递记录器对象使用。禁用日志记录设置为False。默认是 False。
binary # True支持二进制有效载荷,False将所有有效载荷视为文本。在Python 2中,如果设置为True, 则将unicode值视为文本,str并将 bytes值视为二进制。这个选项对Python 3没有任何影响,Python 3总是自动发现文本和二进制的有效载荷。
json # 用于编码和解码数据包的替代json模块。自定义json模块必须具有dumps与loads 标准库版本兼容的功能。
async_handlers # 如果设置为True,事件处理程序在不同的线程中执行。要同步运行处理程序,请设置为False。默认是False。
kwargs # 底层Engine.IO服务器的连接参数。[具体参数请参考官方文档](https://python-socketio.readthedocs.io/en/latest/)
emit(event,data = None,room = None,skip_sid = None,namespace = None,callback = None,** kwargs )
向一个或多个连接的客户端发出自定义事件。
注意:这里我们emit room的话,那么room中所有的连接的用户可以直接触发这个event
事件。room也可以是单独的用户的sid,那么就只会给这个人传递。
event # 事件名称。它可以是任何字符串。事件名称 `connect`, `message`, `disconnect` 保留,不应该使用。
data # 要发送给客户端或多个客户端的数据。数据可以是`str`,`bytes`,`list`, `dict`类型,如果是一个`list`或者`dict`, 数据将被序列化为JSON。
room # 消息的接收者。这可以设置为客户端的会话ID来处理该客户的房间,或者由应用程序创建的任何自定义房间。如果省略该参数,则将事件广播给所有连接的客户端。
skip_sid # 广播到房间或所有客户端时要跳过的客户端的会话ID。这可以用来防止邮件被发送到发件人。
namespace # 事件的Socket.IO命名空间。如果省略此参数,则该事件将发送到默认名称空间。
callback # 如果给定,将调用此函数来确认客户端已收到消息。传递给函数的参数是客户端提供的参数。回拨函数只能在寻址单个客户端时使用。
ignore_queue # 仅在配置消息队列时使用。如果设置为True,该事件直接发送到客户端,而不通过队列。这是更高效的,但只有在使用单个服务器进程时才有效。建议始终将此参数保留为其默认值False。
处理来自客户端的HTTP请求。
这是Socket.IO应用程序的入口点,使用与WSGI应用程序相同的接口。对于典型的用法,这个函数是由Middleware
实例调用的,但是在不使用中间件的时候可以直接调用。
environ # WSGI环境。
start_response # WSGI start_response函数。
该函数返回HTTP响应正文以字节序列传递给客户端。
event # 事件名称。它可以是任何字符串。事件名称 'connect','message'和'disconnect'保留,不能使用。
handler # 应该被调用来处理事件的函数。当没有给出这个参数时,该方法充当处理函数的装饰器。
namespace # 事件的Socket.IO命名空间。如果省略此参数,则处理程序将与默认名称空间关联。
用法示例:
# as a decorator:
@socket_io.on('connect', namespace='/chat')
def connect_handler(sid, environ):
print('Connection request')
if environ['REMOTE_ADDR'] in blacklisted:
return False # reject
# as a method:
def message_handler(sid, msg):
print('Received message: ', msg)
eio.send(sid, 'response')
socket_io.on('message', namespace='/chat', message_handler)
处理函数接收sid客户端的(会话ID)作为第一个参数。'connect'事件处理程序接收WSGI环境作为第二个参数,并且可以返回False拒绝连接。'message'自定义事件名称的处理程序和处理程序将接收消息有效内容作为第二个参数。从消息处理程序返回的任何值将传递给客户端的确认回调函数(如果存在)。该 'disconnect'处理器不采取第二个参数。
send(data, room=None, skip_sid=None, namespace=None, callback=None, **kwargs)
发送消息给一个或多个连接的客户端。
这个函数用名字发出一个事件'message'
。使用 emit()
发出自定义事件的名称。
data # 要发送给客户端或客户端的数据。数据可以是类型的str,bytes,list或dict。如果一个 listor dict,数据将被序列化为JSON。
room # 消息的接收者。这可以设置为客户端的会话ID来处理该客户的房间,或者由应用程序创建的任何自定义房间。如果省略该参数,则将事件广播给所有连接的客户端。
skip_sid # 广播到房间或所有客户端时要跳过的客户端的会话ID。这可以用来防止邮件被发送到发件人。
namespace # 事件的Socket.IO命名空间。如果省略此参数,则该事件将发送到默认名称空间。
callback # 如果给定,将调用此函数来确认客户端已收到消息。传递给函数的参数是客户端提供的参数。回拨函数只能在寻址单个客户端时使用。
ignore_queue # 仅在配置消息队列时使用。如果设置为True,该事件直接发送到客户端,而不通过队列。这是更高效的,但只有在使用单个服务器进程时才有效。建议始终将此参数保留为其默认值False。
class socketio.AsyncServer(client_manager=None, logger=False, json=None, async_handlers=False, **kwargs)
一个使用asyncio的Socket.IO服务器。
这个类实现了完全兼容的Socket.IO web服务器,支持websocket和长轮询传输,与Python 3.5+和asyncio框架兼容。
client_manager # 将管理客户端列表的客户端管理器实例。当这被省略时,客户列表被存储在内存中的结构中,所以不能使用多个连接的服务器。
logger # 启用日志记录设置True或传递记录器对象使用。禁用日志记录设置为False。
json # 用于编码和解码数据包的替代json模块。自定义json模块必须具有dumps与loads 标准库版本兼容的功能。
async_handlers # 如果设置为True,事件处理程序在不同的线程中执行。要同步运行处理程序,请设置为False。默认是False。
kwargs # 底层Engine.IO服务器的连接参数。 [具体参数参考](https://python-socketio.readthedocs.io/en/latest/)
emit(event,data = None,room = None,skip_sid = None,namespace = None,callback = None,** kwargs )
向一个或多个连接的客户端发出自定义事件。
event # 事件名称。它可以是任何字符串。事件名称'connect','message'和'disconnect'保留,不应该使用。
data # 要发送给一个或多个客户端的数据。数据可以是类型的str,bytes,list或dict。如果一个 list 或者 dict,数据将被序列化为JSON。
room # 消息的接收者。这可以设置为客户端的会话ID来处理该客户的房间,或者由应用程序创建的任何自定义房间。如果省略该参数,则将事件广播给所有连接的客户端。
skip_sid # 广播到房间或所有客户端时要跳过的客户端的会话ID。这可以用来防止邮件被发送到发件人。
namespace # 事件的Socket.IO命名空间。如果省略此参数,则该事件将发送到默认名称空间。
callback # 如果给定,将调用此函数来确认客户端已收到消息。传递给函数的参数是客户端提供的参数。回拨函数只能在寻址单个客户端时使用。
ignore_queue # 仅在配置消息队列时使用。如果设置为True,该事件直接发送到客户端,而不通过队列。这是更高效的,但只有在使用单个服务器进程时才有效。建议始终将此参数保留为其默认值False。
注意:这个方法是一个协程。
event # 事件名称。它可以是任何字符串。事件名称'connect','message'和'disconnect'保留,不应使用。
handler # 应该被调用来处理事件的函数。当没有给出这个参数时,该方法充当处理函数的装饰器。
namespace # 事件的Socket.IO命名空间。如果省略此参数,则处理程序将与默认名称空间关联。
# as a decorator:
@socket_io.on('connect', namespace='/chat')
def connect_handler(sid, environ):
print('Connection request')
if environ['REMOTE_ADDR'] in blacklisted:
return False # reject
# as a method:
def message_handler(sid, msg):
print('Received message: ', msg)
eio.send(sid, 'response')
socket_io.on('message', namespace='/chat', message_handler)
处理函数接收sid客户端的(会话ID)作为第一个参数。'connect'事件处理程序接收WSGI环境作为第二个参数,并且可以返回False到拒绝连接。'message'自定义事件名称的处理程序和处理程序将接收消息有效内容作为第二个参数。从消息处理程序返回的任何值将传递给客户端的确认回调函数(如果存在)。该 'disconnect'处理器不采取第二个参数。
send(data,room = None,skip_sid = None,namespace = None,callback = None,** kwargs )
发送消息给一个或多个连接的客户端。
这个函数用名字发出一个事件'message'
。使用 emit()
发出自定义事件的名称。
data # 要发送给一个或多个客户端的数据。数据可以是类型的str,bytes,list或dict。如果一个 listor dict,数据将被序列化为JSON。
room # 消息的接收者。这可以设置为客户端的会话ID来处理该客户的房间,或者由应用程序创建的任何自定义房间。如果省略该参数,则将事件广播给所有连接的客户端。
skip_sid # 广播到房间或所有客户端时要跳过的客户端的会话ID。这可以用来防止邮件被发送到发件人。
namespace # 事件的Socket.IO命名空间。如果省略此参数,则该事件将发送到默认名称空间。
callback # 如果给定,将调用此函数来确认客户端已收到消息。传递给函数的参数是客户端提供的参数。回拨函数只能在寻址单个客户端时使用。
ignore_queue # 仅在配置消息队列时使用。如果设置为True,该事件直接发送到客户端,而不通过队列。这是更高效的,但只有在使用单个服务器进程时才有效。建议始终将此参数保留为其默认值False。
注意:这个方法是一个协程。
1.class socketio.Namespace(namespace = None )
基于类的命名空间的基类。
基于类的命名空间是一个包含Socket.IO命名空间的所有事件处理程序的类。该事件处理程序与前缀类的方法on_,比如on_connect,on_disconnect, on_message,on_json,等。
namespace # 与该类中定义的所有事件处理函数一起使用的Socket.IO命名空间。如果省略此参数,则使用默认名称空间。
emit(event,data = None,room = None,skip_sid = None,namespace = None,callback = None )
向一个或多个连接的客户端发出自定义事件。
与该socketio.Server.emit()
方法唯一的区别是,如果namespace
没有给出参数,则使用与该类关联的名称空间。
send(data,room = None,skip_sid = None,namespace = None,callback = None )
发送消息给一个或多个连接的客户端。
与该socketio.Server.send()
方法唯一的区别是,如果namespace
没有给出参数,则使用与该类关联的名称空间。
将事件分派给适当的处理程序方法。
在最常见的用法中,这个方法不会被子类重载,因为它将事件路由到方法。但是,如果需要特殊的调度规则,或者需要捕获所有事件的单个方法,则可以重写此方法。
五、class socketio.AsyncNamespace
基于asyncio类的名称空间的基类。
基于类的命名空间是一个包含Socket.IO命名空间的所有事件处理程序的类。该事件处理程序与前缀类的方法on_,比如on_connect,on_disconnect, on_message,on_json,等。这些可以是常规函数或协程。
namespace # 与该类中定义的所有事件处理函数一起使用的Socket.IO命名空间。如果省略此参数,则使用默认名称空间。
emit(event,data = None,room = None,skip_sid = None,namespace = None,callback = None )
向一个或多个连接的客户端发出自定义事件。
与该socketio.Server.emit()
方法唯一的区别是,如果namespace
没有给出参数,则使用与该类关联的名称空间。
注意:这个方法是一个协程。
send(data,room = None,skip_sid = None,namespace = None,callback = None )
发送消息给一个或多个连接的客户端。
与该socketio.Server.send()
方法唯一的区别是,如果namespace
没有给出参数,则使用与该类关联的名称空间。
注意:这个方法是一个协程。
将事件分派给适当的处理程序方法。
在最常见的用法中,这个方法不会被子类重载,因为它将事件路由到方法。但是,如果需要特殊的调度规则,或者需要捕获所有事件的单个方法,则可以重写此方法。
注意:这个方法是一个协程。
六、socketio.BaseManager 类
管理客户端连接。
这个班跟踪所有客户和他们所在的房间,以支持消息广播。该类使用的数据存储在内存结构中,仅适用于单个进程服务。更复杂的存储后端可以通过子类来实现。
管理附加到发布/订阅后端的客户列表。
这是一个基类,它允许多个服务器共享客户端列表,服务器通过发布/订阅后端来传递事件。pub / sub后端的使用还允许连接到后端的任何客户端发送发送到Socket.IO客户端的事件。
实际的后端必须由子类来实现,这个类只提供一个pub / sub通用框架。
channel - 服务器发送和接收通知的频道名称
emit(event,data,namespace = None,room = None,skip_sid = None,callback = None,** kwargs )
将消息发送到单个客户端,一个房间或连接到命名空间的所有命名空间。
此方法将消息传递给通过消息队列连接的所有服务器。
参数与在Server.emit()
。中相同。
八、class socketio.KombuManager
class socketio.KombuManager(url ='amqp:// guest:guest @ localhost:5672 //',channel ='socketio',write_only = False )
使用kombu进行进程间消息传递的客户端管理者。
该类使用RabbitMQ,Redis或kombu支持的任何其他消息传递机制实现跨多个进程的事件共享的客户端管理器后端。
要使用kombu后端,请Server
按以下步骤初始化实例:
url = 'amqp://user:password@hostname:port//'
server = socketio.Server(client_manager=socketio.KombuManager(url))
url # * 后端消息传递队列的连接URL。例如连接URL是`'amqp://guest:guest@localhost:5672//'`与`'redis://localhost:6379/'`分别对的RabbitMQ和Redis的。有关如何构建连接URL的更多信息,请参阅[kombu文档](http://kombu.readthedocs.org/en/latest/userguide/connections.html#urls)。
* **频道** - 服务器发送和接收通知的频道名称。在所有服务器中必须相同。
write_only # 如果设置为ot True,则只初始化为发出事件。的缺省False初始化类用于发射和接收。
九、class socketio.RedisManager
class socketio.RedisManager(url ='redis:// localhost:6379/0',channel ='socketio',write_only = False )
Redis的客户端管理者。
这个类实现了一个Redis后端,用于跨多个进程的事件共享。只是作为一个例子来说明如何构建一个自定义后端,因为kombu后端完全可以支持Redis消息队列。
要使用Redis后端,请Server
按以下步骤初始化实例:
url = 'redis://hostname:port/0'
server = socketio.Server(client_manager=socketio.RedisManager(url))
url # Redis服务器的连接URL。对于在同一主机上运行的默认Redis存储,请使用redis://。
channel # 服务器发送和接收通知的频道名称。在所有服务器中必须相同。
write_only # 如果设置为ot True,则只初始化为发出事件。的缺省False初始化类用于发射和接收。
十、socketio.AsyncManager类
管理asyncio服务器的客户端管理者。
emit(event, data, namespace, room=None, skip_sid=None, callback=None, **kwargs)
将消息发送到单个客户端,一个房间或连接到命名空间的所有客户端。
注意:这个方法是一个协程。
class socketio.AsyncRedisManager(url ='redis:// localhost:6379/0',channel ='socketio',write_only = False )
基于Redis的asyncio服务器客户端管理器。
这个类实现了一个Redis后端,用于跨多个进程的事件共享。只是作为一个例子来说明如何构建一个自定义后端,因为kombu后端完全可以支持Redis消息队列.
要使用Redis后端,请Server
按以下步骤初始化实例:
server = socketio.Server(client_manager=socketio.AsyncRedisManager(
'redis://hostname:port/0'))