【问题标题】:JSON messages in SockJS-TornadoSockJS-Tornado 中的 JSON 消息
【发布时间】:2012-09-07 04:17:04
【问题描述】:

在 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 处理了?另外,on_message()方法中的message参数是不是也总是一个JSON对象?

【问题讨论】:

    标签: websocket tornado sockjs


    【解决方案1】:

    SockJS 是 websocket 仿真层。 Websockets 不支持除文本和二进制数据之外的任何内容。

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

    是的,如果将 json 用作应用程序协议,则会发生双重编码。但是,如果您要使用广播功能 - 使用优化的 broadcast() 方法,它只会对所有接收者执行一次 json 编码。

    邮件列表中也有相关讨论:https://groups.google.com/forum/?fromgroups#!topic/sockjs/vsFvHqppq5g

    【讨论】:

    • 所以 SockJS-Torando 确实对每个传出的 msg 进行 json 编码,在这种情况下,我只需要这样做:msg = {'type': 1, 'body': blah},然后是 self.send(msg)self.broadcast(conns, msg)。为什么我要将 msg 编码为 JSON 两次?
    • 因为这是“不好的做法”。如果您稍后要切换到本机 websocket,则必须在发送任何内容之前修复您的代码以应用 JSON 编码。将 SockJS 视为 websocket 替代品,它不能发送除文本之外的任何内容。是的,您可以通过网络发送任意 Python 对象,但在下一个 SockJS 版本中,您的代码可能会中断,因为这不是预期的行为。
    • 只是为了确认,即使使用broadcast()方法,我们仍然需要在调用之前自己对味精编码一次,对吧?
    • 是的,您通过网络发送的任何内容都应转换为字符串。让我解释一下 broadcast() 方法的作用。假设您想向一千个收件人发送一封邮件。您可以遍历它们并为每个客户端对象调用 .send() 。如果您的应用程序协议是 JSON,这将需要对同一消息进行 2000 次编码。但是,如果您将使用广播(),则无论接收者数量如何,同一条消息都只会被编码两次。
    猜你喜欢
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 2012-09-04
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多