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

如何强制Autobahn websocket服务器中的sendMessage立即发送数据,websocket,autobahn,Websocket,Autobahn,我正在尝试使用websocket编写客户端/服务器应用程序。我正在考虑使用Autobahn websocket作为我的通信媒介。客户端将向服务器发送一个命令以执行任务,然后等待服务器的一系列进度响应。在服务器中,从客户机收到命令后,我执行一系列任务,然后调用self.sendMessage(“完成百分比”)%(百分比)到客户机。我遇到的问题是sendMessage似乎缓冲了所有消息,然后在最后一次发送了所有消息。你知道我怎样才能解决这个问题吗?以下是websocket/example/echo/

我正在尝试使用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秒从服务器接收一条消息,而不是一次获取所有三条消息

时间。睡眠将阻塞扭曲的电抗器。那(几乎)从来都不是个好主意。Twisted具有
反应器。callLater
以非阻塞方式延迟


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

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

self.sendMessage(msg, binary, fragmentSize=len(msg))
来自websocket协议RFC6455

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


提供一些您正在使用的代码也是很有帮助的。请参阅我在那里投入时间。睡眠仅用于测试。我的观点是,在调用每个self.sendMessage()之后,在服务器进入睡眠状态之前,数据应该已经发送到客户端。但是,在服务器示例代码中完成所有三个self.sendMessage()调用之前,我的客户端都会收到消息。在我看来,在立即发送消息之前,它会将事情缓冲起来。这是我可以进行的刷新调用,还是我可以调用以立即发送数据的配置?我试过你给我指出的广播例子,我也有同样的问题。Igain:a)
时间。睡眠将阻塞反应器(这是您的代码的问题),b)广播示例工作正常。你可以不理我;)相信我,我不是在忽视你。我真的很感谢你的帮助。听起来,如果您在同一个函数中多次调用sendMessage(),那么在函数返回且reactor获得控制权后,它们将立即被发送,对吗?如果是这样,我是否可以强制sendMessage立即通过网络发送数据。我确实在广播中修改了tick()例程,并向self.broadcast添加了更多调用(“一些随机消息”),直到例程返回并再次获得控制权,才发送实际消息。我需要实时的服务器消息。