Python 从Twisted客户端发送到Twisted服务器,仅此一种方式

Python 从Twisted客户端发送到Twisted服务器,仅此一种方式,python,networking,twisted,Python,Networking,Twisted,我想使用Twisted重建现有应用程序的通信部分。此应用程序确实会将数据从客户端发送到服务器,只有这样,服务器才不会发送任何内容 我如何使用Twisted的事件驱动概念来实现这一点?我目前使用的是Protocol的connectionMade方法,但我认为这不是正确的方法 class Send(Protocol): def connectionMade(self): while True: data = queue.get()

我想使用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
之外,我永远不会到达任何其他事件,因为服务器不会向客户端发送任何内容。我应该改变这种行为吗?

这里还有一个问题,它使用UDP/多播在服务器和客户端之间进行对话

我还建议您阅读twisted文档中的其他内容和示例


  • 不,那绝对不是正确的方法。永远不要给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)
    

    讨论扭曲代码中循环的危险性,还包括生产者/消费者,这可能对提问者有所帮助。是的,在扭曲事件中不使用循环或阻止调用听起来是合理的,这会使事件驱动的框架变得毫无意义。为什么永远不要调用
    doWrite
    doWrite
    是在写入一些数据时从反应器调用的方法。这意味着基础文件描述符已准备好写入。