我希望服务器和客户端能够相互通信。
客户方:
removeAll
但是,只要服务器发送消息,就不会调用on_message。你对这些有任何想法吗?
答案 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)
虽然,我不能说这是否能解决你的问题。