从Twisted客户端发送到Twisted服务器,仅此单向

3 投票
2 回答
1893 浏览
提问于 2025-04-16 04:15

我想用Twisted来重建一个现有应用程序的通信部分。这个应用程序确实可以从客户端向服务器发送数据,但服务器并没有发送任何东西。

我该如何利用Twisted的事件驱动概念来实现这个功能呢?目前我在用ProtocolconnectionMade方法,但我觉得这不是正确的做法。

class Send(Protocol):

    def connectionMade(self):
        while True:
            data = queue.get()
            self.transport.write(data + "\n")
            self.transport.doWrite()

我很确定,这样做不是对的。;-)

补充说明: 我的问题是,我无法想象该用什么事件。我觉得connectionMade事件不太合适,但在我的情况下,我只会遇到connectionLost这个事件,因为服务器并没有向客户端发送任何东西。我应该改变这种行为吗?

2 个回答

1

这里有另一个问题,讨论的是如何通过UDP和多播在服务器和客户端之间进行通信。

我还建议你看看Twisted文档中的一些额外阅读材料和示例。

2

不,这绝对不是正确的方法。绝对不要调用 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)

撰写回答