从Twisted客户端发送到Twisted服务器,仅此单向
我想用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
这个事件,因为服务器并没有向客户端发送任何东西。我应该改变这种行为吗?
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)