如何强制我的高速公路网络套接字服务器中的 sendMessage 立即发送数据



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

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

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

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

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

来自网络套接字协议 RFC 6455

分段的主要目的是允许发送消息 当消息启动时大小未知,而不必 缓冲该消息。如果消息无法分段,则 端点必须缓冲整个消息,以便其长度可以 在发送第一个字节之前计数。对于碎片,一个 服务器或中介可以选择合理大小的缓冲区,并且当 缓冲区已满,向网络写入片段。

相关内容

  • 没有找到相关文章

最新更新