Websocket SockJS Tornado中的JSON消息
在SockJS Tornado库的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)
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(),则不管收件人的数量如何,同一消息只会被编码两次。