Autobahn twisted websocket 服务器不会向客户端发送消息,除非它收到来自客户端的消息

Autobahn twisted websocket server does not send messages to client unless it receives a message from a client

我是 运行 autobahn/twisted python websocket 服务器,我在向客户端发送消息时遇到问题。它似乎只在客户端向其发送消息时才向客户端发送消息。出于某种原因,如果我想强制向已连接的客户端发送消息,消息会卡在队列中,直到任何客户端向我发送消息。那时,所有排队的消息都会发送给所有客户端。

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

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

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

Autobahn/twisted python websocket server

Javascript websocket client

Python websocket client

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

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

Python 客户端显示服务器发送消息与 python 客户端接收消息之间的时间差。请注意,它们成块出现,有些会有很大的延迟。

Javascript 客户端仅在向服务器发送新消息后才以 4 个为一组获取它们。

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

首先尝试在基于 Twisted 的程序中完全不使用多线程。我在您的代码中没有看到任何调用多线程的内容。