Websocket客户端在从服务器收到消息时不调用on_message_callback()函数

时间:2018-04-09 11:33:03

标签: tornado

我希望服务器和客户端能够相互通信。

客户方:

removeAll

但是,只要服务器发送消息,就不会调用on_message。你对这些有任何想法吗?

1 个答案:

答案 0 :(得分:1)

好吧,我看了一下源代码。我无法确定问题,因为我没有 了解它的大部分功能。

但我注意到我认为可能导致问题的某些事情。对于 示例this code block

response = yield self.ws.read_message(callback=self.cb_receive_weight)

...

if response.done() :

这会引发错误。 response不是未来,而是实际的websocket 消息字符串。因此,它会引发一个没有done()方法的AttributeError。

其次,callback=self.cb_receive_weight这会调用cd_receive_weight 未来的方法,而不是消息。所以,那是行不通的。

我认为事情没有按预期工作,可能是因为你正在混合yield 和回调。

请注意,yield object会自动调用object.result()。考虑一下:

response = yield self.ws.read_message()

上面,ws.read_message()返回Future,但yield将等到Future 有一个结果。当未来得到解决后,yield将调用其result()方法。 response将等于该结果。

如果您使用yield,则不需要使用回调。我建议不要 完全使用回调编码风格。只是避免它们并使用协同程序(yield) 在可能的情况下。

代码将更短,更有条理。

示例:

@gen.coroutine
def connect(self):
    self.ws = yield websocket_connect(url)

    self.run()

...

@gen.coroutine
def get_weight_from_global_network(self):

    while True:
        response = yield self.ws.read_message()

        # do something with the response

        self.cb_recieve_weight(weight=response)

虽然,我不能说这是否能解决你的问题。