我正在尝试使用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秒从服务器收到一条消息,而不是一次收到所有三条消息。
答案 0 :(得分:0)
time.sleep
将阻止Twisted反应堆。这(几乎)从来都不是一个好主意。 Twisted的reactor.callLater
以非阻塞方式延迟。
您可以查看示例here,以确保Autobahn立即发送消息。
答案 1 :(得分:0)
我遇到了同样的问题,在阅读了特定于websocket协议后,我有一个解决方案:
self.sendMessage(msg, binary, fragmentSize=len(msg))
来自websocket协议RFC 6455
碎片化的主要目的是允许发送消息 在没有必要的情况下启动消息时,它的大小未知 缓冲那条消息。如果消息不能分段,那么 端点必须缓冲整个消息,以便它的长度可以 在发送第一个字节之前计算。碎片化,a 服务器或中介可以选择合理大小的缓冲区,何时 缓冲区已满,将片段写入网络。