我想使用Twisted来重建现有应用程序的通信部分。此应用程序确实将数据从客户端发送到服务器,只有这样,服务器才会发送任何内容。
如何通过事件驱动的Twisted概念实现这一目标?我目前使用connectionMade
的{{1}}方法,但我不认为这是正确的方法。
Protocol
我很确定,这是不的方式。 ; - )
加成:
我的问题是,我无法想象使用什么事件。我认为class Send(Protocol):
def connectionMade(self):
while True:
data = queue.get()
self.transport.write(data + "\n")
self.transport.doWrite()
事件不正确,但在我的情况下,我永远不会到达connectionMade
以外的任何其他事件,因为服务器不会向客户端发送任何内容。我应该改变这种行为吗?
答案 0 :(得分: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)
答案 1 :(得分:1)
这是另一个使用UDP /多播在服务器和客户端之间进行通信的问题
我还会建议一些额外的阅读和自己扭曲的文档中的例子。