Websocket SockJS Tornado中的JSON消息

Websocket SockJS Tornado中的JSON消息,websocket,tornado,sockjs,Websocket,Tornado,Sockjs,在SockJS Tornado库的on_message()方法中,我想向客户端发送JSON消息:有时使用send()方法发送给特定的客户端,有时使用broadcast()方法发送给一组客户端 我想知道在发送消息之前是否需要自己使用类似于simplejson的东西来编码字符串键控字典对象,即 on_message(self, message): ... data = {'type': 1, 'body': 'blah'} msg = json.dump(data)

在SockJS Tornado库的
on_message()
方法中,我想向客户端发送JSON消息:有时使用
send()
方法发送给特定的客户端,有时使用
broadcast()
方法发送给一组客户端

我想知道在发送消息之前是否需要自己使用类似于
simplejson
的东西来编码字符串键控字典对象,即

on_message(self, message):
    ...
    data = {'type': 1, 'body': 'blah'}
    msg = json.dump(data)
    # self.send(msg) or self.broadcast(conns, msg)

或者编码部分已经被SockJS Tornado处理了?另外,message()上的
方法中的
message
参数是否始终也是JSON对象?

SockJS是websocket仿真层。WebSocket只支持文本和二进制数据

因此,尽管您可以通过网络发送任意python对象(sockjs tornado将执行内部json序列化,并且不强制执行字符串),但出于兼容性原因,不鼓励这样做

是的,如果将json用作应用程序协议,则会发生双重编码。但是,如果您打算使用广播功能—使用optimized broadcast()方法,它将只对所有收件人进行一次json编码


邮件列表中也有相关的讨论:

所以SockJS Torando会对每个传出的消息进行json编码,在这种情况下,我只需要做:
msg={'type':1,'body':blah}
然后是
self.send(msg)
self.broadcast(conns,msg)
。为什么我要将msg编码为JSON两次?因为这是“糟糕的做法”。如果以后要切换到本机WebSocket,则必须在发送任何内容之前修复代码以应用JSON编码。将SockJS看作websocket的替代品,它只能发送文本。是的,您可以通过网络发送任意Python对象,但在下一个SockJS版本中,您的代码可能会中断,因为这不是预期的行为。请确认,即使使用
broadcast()
方法,在调用msg之前,我们仍然需要自己对其编码一次,对吗?是的,通过网络发送的任何内容都应该转换为字符串。让我解释一下broadcast()方法的作用。假设您想向一千个收件人发送一条消息。您可以循环遍历它们,并为每个客户端对象调用.send()。如果您的应用程序协议是JSON,则需要将同一消息编码2000次。但是,如果使用broadcast(),则不管收件人的数量如何,同一消息只会被编码两次。