0

我正在尝试使用 websocket 编写客户端/服务器应用程序。我正在考虑使用 Autobahn websocket 作为我的通信媒介。客户端将向服务器发送命令以执行任务,然后等待服务器的一系列进度响应。在服务器中,我收到客户端的命令后,执行一系列任务,然后调用 self.sendMessage("percent completed") % (percent) 给客户端。我遇到的问题是 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 秒从服务器接收一条消息,而不是一次获取所有三条消息。

4

2 回答 2

0

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

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

于 2013-10-09T08:00:56.737 回答
0

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

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

来自 websocket 协议 RFC 6455

分片的主要目的是允许在消息开始时发送大小未知的消息,而不必缓冲该消息。如果消息不能被分段,那么端点将不得不缓冲整个消息,以便在发送第一个字节之前计算其长度。使用分片,服务器或中介可以选择一个合理大小的缓冲区,当缓冲区满时,将一个分片写入网络。

于 2018-02-11T11:36:49.177 回答