4.接收消息

优质
小牛编辑
136浏览
2023-12-01

在使用SocketIO的时候,消息将被作为活动(event)的两端接收。在客户端使用JavaScript回叫信号。使用Flask-SocketIO服务器,需要为这些活动注册处理器(handler),类似于视图函数怎样处理路由。

下面的例子是为一个未命名的活动创建了一个服务端的活动处理器(event handler):

@socketio.on('message')
def handle_message(message):
  print('received message: ' + message)

在上面的例子中,使用了字符串消息。此外,另一种未命名的活动使用了JSON数据:

@socketio.on('json')
def handle_json(json):
  print('received json: '+ str(json))

最灵活的一种活动使用了自定义的活动名称。这些活动的消息数据类型可以是字符串,字节,整型,或者JSON:

@socketio.on('my event')
def handle_my_custom_event(json):
  print('received json: ' + str(json))

自定义名称的活动可以支持多参数:

@socketio.on('my event')
def handle_my_sustom_event(arg1, arg2, arg3):
  print('received args: ' + arg1 + arg2 + arg3)

命名活动是极度复杂的,在其消除了额外的元数据(metadata)来描述消息类型的时候。

Flask-SocketIO同样支持命名空间(namespace),这个功能允许客户端在一个相同的物理socket上多路复用几个独立的连接:

@scoketio.on('my event', namespace='/test')
def handle_my_custom_namespace_event(json):
  print('received json: ' + str(json))

当一个命名空间没有具体指出,一个全局的命名空间'/'将会被启用

有时,装饰器的语法并不方便,on_event()方法可以作为替代

def my_function_handler(data):
  pass
socketio.on_event('my event', my_function_handler, namespace='/test')

客户端要求一个确认回复,来确认消息的接收。任何一个从处理函数(handler function)中返回的值都会在回调函数中作为一个参数返回给客户端。

@socketio.on('my event')
def handle_my_custom_event(json):
  print('received json: ' + str(json))
  return('one', 2)

在上面的例子中,客户端回调函数将会回调两个参数,one2。如果处理函数没有返回值,这个客户端回调函数将以没有参数的情况返回。