Server
class socketio.Server(client_manager=None, logger=False, serializer='default', json=None, async_handlers=True, always_connect=False, namespaces=None, **kwargs)
一个 Socket.IO 服务器。
该类实现了一个完全兼容的 Socket.IO Web 服务器,支持 WebSocket 和长轮询传输。
参数
client_manager
:管理客户端列表的客户端管理器实例。若省略此参数,客户端列表将存储在内存结构中,因此无法使用多个连接的服务器。logger
:若要启用日志记录,可将其设为True
或传入一个日志记录器对象;若要禁用日志记录,可将其设为False
。默认值为False
。请注意,即使logger
为False
,严重错误仍会被记录。serializer
:传输数据包时使用的序列化方法。有效值为'default'
、'pickle'
、'msgpack'
和'cbor'
。或者,也可以提供Packet
类的子类,并自定义实现encode()
和decode()
方法。客户端和服务器必须使用兼容的序列化器。json
:用于对数据包进行编码和解码的替代 JSON 模块。自定义 JSON 模块必须具备与标准库版本兼容的dumps
和loads
函数。async_handlers
:若设为True
,客户端的事件处理程序将在单独的线程中执行。若要同步运行客户端的处理程序,可将其设为False
。默认值为True
。always_connect
:若设为False
,新连接在connect
处理程序返回非False
的值之前是临时的,此时连接才会被接受。若设为True
,连接将立即被接受,然后如果connect
处理程序返回False
,则会发起断开连接操作。如果需要从connect
处理程序中发出事件,并且客户端在连接接受之前收到事件时会产生混淆,可将其设为True
。在其他情况下,使用默认值False
。namespaces
:除已定义处理程序的命名空间外,允许的命名空间列表。默认值为['/']
,即始终允许连接到默认命名空间。将其设为'*'
可允许所有命名空间。kwargs
:底层 Engine.IO 服务器的连接参数。
Engine.IO 配置支持以下设置
async_mode
:要使用的异步模型。请参阅文档中的 “部署” 部分以了解可用选项的描述。有效的异步模式包括'threading'
、'eventlet'
、'gevent'
和'gevent_uwsgi'
。如果未提供此参数,服务器将首先尝试使用'eventlet'
,然后是'gevent_uwsgi'
,接着是'gevent'
,最后是'threading'
。选择第一个已安装所有依赖项的异步模式。ping_interval
:服务器向客户端发送心跳包的时间间隔(秒)。默认值为 25 秒。若需要更精细的控制,可提供一个包含两个元素的元组,其中第一个数字是心跳间隔,第二个数字是服务器添加的宽限期。ping_timeout
:客户端在断开连接之前等待服务器响应的时间(秒)。默认值为 20 秒。max_http_buffer_size
:接受的传入消息的最大大小。默认值为 1000000 字节。尽管名称如此,但此参数设置的值对 HTTP 长轮询和 WebSocket 连接均有效。allow_upgrades
:是否允许传输升级。默认值为True
。http_compression
:使用长轮询传输时是否压缩数据包。默认值为True
。compression_threshold
:仅当消息的字节大小大于此值时才进行压缩。默认值为 1024 字节。cookie
:若设置为字符串,则为服务器发送回客户端的包含客户端会话 ID 的 HTTP cookie 名称。若设置为字典,'name'
键包含 cookie 名称,其他键定义 cookie 属性,每个属性的值可以是字符串、无参数的可调用对象或布尔值。若设置为None
(默认值),则不向客户端发送 cookie。cors_allowed_origins
:允许连接到此服务器的源或源列表。默认情况下,仅允许同源连接。将此参数设置为'*'
以允许所有源,或设置为[]
以禁用 CORS 处理。cors_credentials
:是否允许在向此服务器的请求中携带凭证(cookie、身份验证)。默认值为True
。monitor_clients
:若设置为True
,后台任务将确保关闭不活跃的客户端。将其设置为False
可禁用监控任务(不建议)。默认值为True
。transports
:允许的传输列表。有效的传输方式有'polling'
和'websocket'
。默认值为['polling', 'websocket']
。engineio_logger
:若要启用 Engine.IO 日志记录,可将其设为True
或传入一个日志记录器对象;若要禁用日志记录,可将其设为False
。默认值为False
。请注意,即使engineio_logger
为False
,严重错误仍会被记录。
call(event, data=None, to=None, sid=None, namespace=None, timeout=60, ignore_queue=False)
向客户端发出自定义事件并等待响应。
此方法会发出一个带有回调的事件,并在回调被调用后才返回。若在超时前回调未被调用,则会引发 TimeoutError
异常。若在等待期间 Socket.IO 连接断开,此方法仍会等待至指定的超时时间。
参数
event
:事件名称,可以是任意字符串。'connect'
、'message'
和'disconnect'
这些事件名称是保留名称,不应使用。data
:要发送给客户端的数据。数据类型可以是str
、bytes
、list
或dict
。若要发送多个参数,可使用元组,其中每个元素的类型应为上述类型之一。to
:接收客户端的会话 ID。sid
:to
参数的别名。namespace
:事件的 Socket.IO 命名空间。若省略此参数,则事件将发送到默认命名空间。timeout
:等待超时时间。若在客户端确认事件之前超时,则会引发TimeoutError
异常。ignore_queue
:仅在配置了消息队列时使用。若设置为True
,事件将直接发送给客户端,而不经过队列。这样更高效,但仅在使用单个服务器进程时有效。建议始终将此参数保留为默认值False
。
注意:此方法不是线程安全的。若多个线程同时向同一个客户端发出事件,则由多个数据包组成的消息可能会以错误的顺序发送。可使用标准的并发解决方案(如 Lock
对象)来避免这种情况。
close_room(room, namespace=None)
关闭一个房间。
此函数会将给定房间中的所有客户端移除。
参数
room
:房间名称。namespace
:事件的 Socket.IO 命名空间。若省略此参数,则使用默认命名空间。
disconnect(sid, namespace=None, ignore_queue=False)
断开客户端的连接。
参数
sid
:客户端的会话 ID。namespace
:要断开连接的 Socket.IO 命名空间。若省略此参数,则使用默认命名空间。ignore_queue
:仅在配置了消息队列时使用。若设置为True
,断开连接操作将在本地处理,而不在队列上广播。建议始终将此参数保留为默认值False
。
emit(event, data=None, to=None, room=None, skip_sid=None, namespace=None, callback=None, ignore_queue=False)
向一个或多个已连接的客户端发出自定义事件。
参数
event
:事件名称,可以是任意字符串。'connect'
、'message'
和'disconnect'
这些事件名称是保留名称,不应使用。data
:要发送给客户端的数据。数据类型可以是str
、bytes
、list
或dict
。若要发送多个参数,可使用元组,其中每个元素的类型应为上述类型之一。to
:消息的接收方。可以设置为客户端的会话 ID 以仅向该客户端发送消息,也可以设置为应用程序创建的任何自定义房间名称以向该房间中的所有客户端发送消息,或者设置为自定义房间名称列表。若省略此参数,则事件将广播给所有已连接的客户端。room
:to
参数的别名。skip_sid
:在向房间