首页 > 解决方案 > Autobahn twisted websocket 服务器不会向客户端发送消息,除非它接收到来自客户端的消息

问题描述

我正在运行高速公路/扭曲的 python websocket 服务器,但在向客户端发送消息时遇到问题。当客户端向它发送消息时,它似乎只向客户端发送消息。出于某种原因,如果我想强制向连接的客户端发送消息,则消息会卡在队列中,直到任何客户端向我发送消息。此时,所有排队的消息都会发送给所有客户端。

我能够使用 python 客户端和 javascript 客户端针对这个 python autobahn/twisted websocket 服务器重现这种行为。

谁能告诉我如何正确地将消息从 websocket 服务器发送到所有连接的客户端?我的目标是让客户端订阅事件,然后服务器只向他们发送事件消息。但是由于某种原因,上述行为不允许服务器向客户端发送消息,除非他们首先向服务器发送消息。

您可以使用下面的代码轻松地重现它: 您只需要一台服务器和一个客户端即可重现它。我使用了两个不同的客户端来证明问题出在服务器上。

Autobahn/twisted python websocket 服务器

Javascript websocket 客户端

Python websocket 客户端

无论我使用哪个 websocket 客户端,我都会看到相同的行为。很明显,websocket 服务器出于某种原因正在排队消息。

服务器日志,每 5 秒在它声称发送消息的点上。

Python 客户端显示服务器发送消息和 Python 客户端收到消息之间的时间差。请注意,它们是大块的,有些延迟很大。

只有在向服务器发送新消息后,Javascript 客户端才会以 4 块的形式获取它们。

标签: pythonwebsockettwistedautobahn

解决方案


Twisted API 不是线程安全的。除了 之外reactor.callFromThread,您只能在反应器运行的线程中调用它们。

尝试在基于 Twisted 的程序中完全不使用多线程,作为开始。我在您的代码中看不到任何需要多个线程的内容。


推荐阅读