如何强制我的Autobahn websocket服务器中的sendMessage立即发送数据

时间:2013-10-08 21:14:59

标签: websocket autobahn

我正在尝试使用websocket编写客户端/服务器应用程序。我正在考虑使用Autobahn websocket作为我的沟通媒介。客户端将向服务器发送命令以执行任务,然后等待来自服务器的一系列进度响应。在服务器中,我从客户端收到命令后,执行一系列任务,然后将self.sendMessage(“完成百分比”)%(百分比)调用到客户端。我遇到的问题是sendMessage似乎缓冲了所有消息,然后在结束时立即发送它们。关于如何解决这个问题的任何想法?这是来自websocket / example / echo / server.py的代码片段:

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秒从服务器收到一条消息,而不是一次收到所有三条消息。

2 个答案:

答案 0 :(得分:0)

time.sleep将阻止Twisted反应堆。这(几乎)从来都不是一个好主意。 Twisted的reactor.callLater以非阻塞方式延迟。

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

答案 1 :(得分:0)

我遇到了同样的问题,在阅读了特定于websocket协议后,我有一个解决方案:

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

来自websocket协议RFC 6455

  

碎片化的主要目的是允许发送消息   在没有必要的情况下启动消息时,它的大小未知   缓冲那条消息。如果消息不能分段,那么   端点必须缓冲整个消息,以便它的长度可以   在发送第一个字节之前计算。碎片化,a   服务器或中介可以选择合理大小的缓冲区,何时   缓冲区已满,将片段写入网络。