【问题标题】:Autobahn twisted websocket server does not send messages to client unless it receives a message from a clientAutobahn twisted websocket 服务器不会向客户端发送消息,除非它收到来自客户端的消息
【发布时间】:2020-12-14 21:55:34
【问题描述】:

我正在运行高速公路/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 个块的形式获取它们。

【问题讨论】:

    标签: python websocket twisted autobahn


    【解决方案1】:

    Twisted API 不是线程安全的。除了reactor.callFromThread,你只能在reactor运行的线程中调用它们。

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

    【讨论】:

    • 如何从主线程向所有客户端(或客户端子集)发送消息?主线程不是基本卡在reactor.run()这行了吗?
    • 我可以使用reactor.callFromThread() 让它工作。这就说得通了。但我不确定我是否看到了一个完全不使用多线程的好解决方案。因为我需要某种服务或线程或进程来检测新数据何时到达,因此它知道何时将新数据发送给客户端。我想我可以将它作为一个单独的进程作为 websocket 客户端连接,然后我可以告诉服务器(通过这个新客户端)有新数据可用。这样服务器只能通过主线程上的 websocket 协议与之交互。不过,这似乎是一个糟糕的解决方案
    • 如果你可以说 Twisted 的首要目标是“检测新数据何时到达而不使用多线程或多处理”。听起来您可能没有内化基于 Twisted 的程序的执行模型。 twistedmatrix.com/~exarkun/pycon-presentation.html 可能会有所帮助。
    • 很可能就是这样。当我发现 Twisted 时,我只是在寻找一个优质的 websocket 服务器。我会看看这个。谢谢
    猜你喜欢
    • 2018-10-25
    • 2017-09-15
    • 2022-07-15
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 2018-04-30
    • 1970-01-01
    相关资源
    最近更新 更多