Socket.IO is a transport protocol that enables real-time bidirectional event-based communication between clients (typically, though not always, web browsers) and a server. The official implementations of the client and server components are written in JavaScript. This package provides Python implementations of both, each with standard and asyncio variants.
Socket.IO是一种传输协议,用于 服务器与客户端之间的real-time实时通讯的.是用js写的,python-socketio软件包提供了两种Python的实现方式.一种是异步的一种标准的,但是异步这玩意更新的不完善,有很多坑,所以我们这里还是用标准的.
Quick Start 服务端 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 import eventleteventlet.monkey_patch() import socketiosio = socketio.Server(logger=True , engineio_logger=True ,cors_allowed_origins='*' ) app = socketio.WSGIApp(sio) @sio.event def connect (sid, environ ): print ('connect ' , sid) @sio.event def my_message (sid, data ): print ('message ' , data) @sio.on('my response' ) def response (sid,data ): print (sid) print (data) @sio.event def disconnect (sid ): print ('disconnect ' , sid) if __name__ == '__main__' : SERVER_ADDRESS = ('127.0.0.1' ,8000 ) sock = eventlet.listen(SERVER_ADDRESS) eventlet.wsgi.server(sock, app)
客户端 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import socketiosio = socketio.Client() @sio.event def connect (): print ('connection established' ) @sio.event def my_message (data ): print ('message received with ' , data) sio.emit('my response' , {'response' : 'my response' }) @sio.event def disconnect (): print ('disconnected from server' ) sio.connect('http://127.0.0.1:8000' ) sio.wait()
客户端跟服务端搭建好了,那么怎么如何通信呢?
我们可以通过
1 2 3 4 sio.emit('my response' , {'response' : 'my response' },room=sid)
使用消息队列 Redis 要使用Redis消息队列,必须安装Python Redis客户端
1 2 3 4 5 6 pip install redis mgr = socketio.RedisManager('redis://' ) sio = socketio.Server(client_manager=mgr)
RabbitMQ 1 2 3 4 5 pip install kombu mgr = socketio.KombuManager('amqp://' ) sio = socketio.Server(client_manager=mgr)
从外部发送消息 1 2 3 4 5 6 7 external_sio = socketio.RedisManager('redis://' , write_only=True ) external_sio.emit('my event' , data={'foo' : 'bar' }, room='my room' )
消息队列示例 条件有限,我们这里用redis
服务端 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 import eventleteventlet.monkey_patch() import socketiomgr = socketio.RedisManager('redis://127.0.0.1:6379/0' ) sio = socketio.Server(client_manager=mgr, logger=True , engineio_logger=True ,cors_allowed_origins='*' ) app = socketio.WSGIApp(sio) @sio.event def connect (sid, environ ): print ('connect ' , sid) sio.enter_room(sid,room='user_1' ) @sio.event def disconnect (sid ): print ('disconnect ' , sid) rooms = sio.rooms(sid) for room in rooms: sio.leave_room(sid, room) if __name__ == '__main__' : SERVER_ADDRESS = ('' , 8000 ) sock = eventlet.listen(SERVER_ADDRESS) eventlet.wsgi.server(sock, app)
客户端 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import socketiosio = socketio.Client() @sio.event def connect (): print ('connection established' ) @sio.event def mgr_tst (data ): print ('message received with ' , data) @sio.event def disconnect (): print ('disconnected from server' ) sio.connect('http://127.0.0.1:8000' ) sio.wait()
模拟外部发送消息 1 2 3 4 5 6 7 import socketiomgr = socketio.RedisManager('redis://127.0.0.1:6379/0' ,write_only=True ) mgr.emit('mgr_tst' ,data='client Msg' ,room='user_1' )