从 Twisted 客户端发送到 Twisted 服务器,只有这一种方式

Posted

技术标签:

【中文标题】从 Twisted 客户端发送到 Twisted 服务器,只有这一种方式【英文标题】:Send from Twisted client to Twisted server, only this one way 【发布时间】:2011-04-13 10:57:38 【问题描述】:

我想使用 Twisted 重建现有应用程序的通信部分。这个应用程序确实将数据从客户端发送到服务器,只是这样一来,服务器不发送任何内容。

如何使用 Twisted 的事件驱动概念来实现这一点?我目前使用ProtocolconnectionMade方法,但我认为这不是正确的方法。

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 服务器,只有这一种方式的主要内容,如果未能解决你的问题,请参考以下文章

如何将结构化数据从 Twisted 发送到 syslog?

Twisted 中的多重响应

Python Twisted IRC,发送颜色信息

在Twisted,Oscar中从外部事件处理程序发送ICQ消息

爬虫日记(108):Twisted:使用后悔药

Twisted-AMP:意外的关键字参数