【问题标题】:How do I force the sendMessage in my Autobahn websocket server to send data without delay如何强制我的 Autobahn websocket 服务器中的 sendMessage 立即发送数据
【发布时间】:2013-10-08 21:14:58
【问题描述】:

我正在尝试使用 websocket 编写客户端/服务器应用程序。我正在考虑使用 Autobahn websocket 作为我的通信媒介。客户端将向服务器发送命令以执行任务,然后等待服务器的一系列进度响应。在服务器中,我收到客户端的命令后,执行一系列任务,然后调用 self.sendMessage("percent completed") % (percent) 给客户端。我遇到的问题是 sendMessage 似乎缓冲了所有消息,然后在最后一次全部发送。关于如何解决这个问题的任何想法?这是来自 websocket/example/echo/server.py 的代码 sn-p:

import sys 
import time

from twisted.internet import reactor
from twisted.python import log 
from twisted.web.server import Site
from twisted.web.static import File

from autobahn.websocket import WebSocketServerFactory, \
                               WebSocketServerProtocol, \
                               listenWS

class EchoServerProtocol(WebSocketServerProtocol):

   def onMessage(self, msg, binary):
      self.sendMessage("server respond message 1", binary)
      time.sleep (2) 
      self.sendMessage("server response message 2", binary)
      time.sleep (2) 
      self.sendMessage("server response message 3", binary)

我希望客户端每 2 秒从服务器接收一条消息,而不是一次获取所有三个消息。

【问题讨论】:

标签: websocket autobahn


【解决方案1】:

time.sleep 会阻塞 Twisted reactor。这(几乎)从来都不是一个好主意。 Twisted 有reactor.callLater 以非阻塞方式延迟。

您可以查看示例 here,以确保 Autobahn 立即发送消息。

【讨论】:

  • 我把 time.sleep 放在那里只是为了测试。我的观点是,在调用每个 self.sendMessage() 之后,数据应该在服务器进入睡眠状态之前已经发送到客户端。但是我的客户端确实会收到消息,直到在服务器示例代码中完成所有三个 self.sendMessage() 调用。在我看来,它在一次发送消息之前会缓冲一些东西。这是我可以进行的一些刷新调用还是我可以调用以使数据立即发送的配置?我尝试了您向我指出的广播示例,但我遇到了同样的问题。我
  • 再次:a)time.sleep 将阻塞反应器(这是您的代码的问题)和 b)广播示例有效。你可以无视我;)
  • 我不会忽视你,相信我。我真的很感谢你的帮助。听起来如果你在同一个函数中多次调用 sendMessage() ,它们将在函数返回并且反应堆获得控制权后一次全部发送,对吧?如果是这样,无论如何我可以强制 sendMessage 立即通过网络发送数据。我确实修改了广播中的 tick() 例程,并添加了更多对 self.broadcast("some random msg") 的调用,并且直到例程返回并且反应器再次获得控制权时才发送实际消息。我需要实时的服务器消息。
【解决方案2】:

我和你有同样的问题,在阅读 websocket protocol specific 之后,我有一个解决方案:

self.sendMessage(msg, binary, fragmentSize=len(msg))

来自 websocket 协议 RFC 6455

分片的主要目的是允许发送消息 消息启动时大小未知,而无需 缓冲该消息。如果消息不能被分片,那么 端点必须缓冲整个消息,因此它的长度可以 在发送第一个字节之前进行计数。随着碎片化,一个 服务器或中介可以选择一个合理大小的缓冲区,并且当 缓冲区已满,将片段写入网络。

【讨论】:

    猜你喜欢
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2015-08-25
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多