从 Twisted 客户端发送到 Twisted 服务器,只有这一种方式
Posted
技术标签:
【中文标题】从 Twisted 客户端发送到 Twisted 服务器,只有这一种方式【英文标题】:Send from Twisted client to Twisted server, only this one way 【发布时间】:2011-04-13 10:57:38 【问题描述】:我想使用 Twisted 重建现有应用程序的通信部分。这个应用程序确实将数据从客户端发送到服务器,只是这样一来,服务器不发送任何内容。
如何使用 Twisted 的事件驱动概念来实现这一点?我目前使用Protocol
的connectionMade
方法,但我认为这不是正确的方法。
class Send(Protocol):
def connectionMade(self):
while True:
data = queue.get()
self.transport.write(data + "\n")
self.transport.doWrite()
我很确定,这不是这样做的方式。 ;-)
加法:
我的问题是,我无法想象为此使用什么事件。我认为connectionMade
事件不是正确的,但在我的情况下,我永远不会到达connectionLost
之外的任何其他事件,因为服务器不会向客户端发送任何内容。我应该改变这种行为吗?
【问题讨论】:
【参考方案1】:不,这绝对不是正确的做法。永远不要打电话给doWrite
。
这里的问题是我打赌queue.get()
只是阻塞直到有一些数据。如果可能,请使用非阻塞的消息传递方式而不是线程。例如,让您的线程只需 callFromThread
到您的 Send
协议来做某事。
但是,假设一个阻塞的“get”调用,这样的事情可能会起作用:
from twisted.internet.protocol import Protocol
from twisted.internet.threads import deferToThread
class Send(Protocol):
def connectionMade(self):
self.qget()
def qget(self, data=None):
if data is not None:
self.transport.write(data)
deferToThread(queue.get).addCallback(self.qget)
【讨论】:
***.com/questions/1538617/http-download-very-big-file/… 讨论了 Twisted 代码中循环的危险,还涵盖了可能对提问者有帮助的生产者/消费者。 是的,在 Twisted 事件中不使用循环或阻塞调用听起来很合理,这会使事件驱动的框架变得毫无意义。 你为什么不应该打电话给doWrite
?
doWrite
是从反应器调用的方法,当需要写出一些数据时。这意味着底层文件描述符已准备好写入。【参考方案2】:
这是另一个使用 UDP / 多播在服务器和客户端之间进行通信的问题
UDP client and server with Twisted Python我还建议从它自己的扭曲文档中获得一些额外的阅读和示例。
http://krondo.com/?page_id=1327【讨论】:
以上是关于从 Twisted 客户端发送到 Twisted 服务器,只有这一种方式的主要内容,如果未能解决你的问题,请参考以下文章