繁体   English   中英

具有Twisted的交互式Python客户端/服务器

[英]Interactive Python Client/Server with Twisted

我一直试图围绕如何让Twisted执行,因为缺乏更好的词,“交互式”客户端/服务器行为。

我设法将一对连接到服务的Protocol和ClientFactory类放在一起,并执行立即查询/响应(请参阅:connectionMade - > self.queryStatus)。 这按预期成功,并从Factory类打印服务器的响应。

我现在的问题是,我将有外部事件必须导致数据被发送,同时总是侦听潜在的传入数据。 但是一旦reactor.run()循环开始,我不确定我的应用程序的其余部分是如何触发数据发送的。

我从那以后尝试过几种不同的方法,但这是处理recv部分的最简单的方法,如下所述:

class myListenerProtocol(LineReceiver):
    delimiter = '\n'

    def connectionMade(self):
        print("Connected to: %s" % self.transport.getPeer())
        self.queryStatus(1)

    def dataReceived(self, data):
        print("Receiving Data from %s" % self.transport.getPeer())
        ...
        self.commandReceived(self.myData)

    def commandReceived(self, myData):
        self.factory.commandReceived(myData)

    def connectionLost(self, reason):
        print("Disconnected.")

    def queryStatus(self, CommandValue):
        ...
        strSend = CommandValue # or some such
        self.transport.write(strSend)

class mySocketFactory(ClientFactory):
    protocol = myListenerProtocol

    def __init__(self):
        pass

    def buildProtocol(self, address):
        proto = ClientFactory.buildProtocol(self, address)
        return proto

    def commandReceived(self, myData):
        print myData
        reactor.stop() # It won't normally stop after recv

    def clientConnectionFailed(self, connector, reason):
        print("Connection failed.")
        reactor.stop()


def main():
    f = mySocketFactory()
    reactor.connectTCP("10.10.10.1", 1234, f)
    reactor.run()

我想这很简单,但无数个小时的例子和文档让我对我如何处理这个场景没有很好的理解。

我现在的问题是,我将有外部事件必须导致数据被发送,同时总是侦听潜在的传入数据。 但是一旦reactor.run()循环开始,我不确定我的应用程序的其余部分是如何触发数据发送的。

“外部活动”? 像什么? 数据到达连接? 很好,让反应堆运行意味着你实际上能够处理这些数据。

或者有人点击GUI中的按钮? 尝试使用其中一个GUI集成反应器 - 再次,在反应堆运行之前,您无法处理这些事件。

您可能会陷入困境,因为您认为您的主要功能应该执行reactor.run()然后继续做其他事情 这不是它的工作原理。 编写事件驱动程序时,可以定义所有事件源,然后在事件到达这些源时让事件循环调用处理程序。

好吧,有很多方法,最好的方法实际上取决于你的应用程序的上下文,所以我不会在这里详细说明你这样做的一种方式,而是将你链接到我最近关于黑客新闻的阅读:

和良好的用例示例,虽然它可能不适用于您正在处理的内容(或者您可能已阅读它):

顺便说一句,你也可以看看擅长处理这类事情的gevent或龙卷风。

如果你的其他“事件”来自GUI工具包(比如GTK或QT),那要非常小心GIL ,即使你只是想要命令行事件,你也需要线程并且仍然要小心。

最后,如果您想进行更多交互,您可以为您的服务器编写不同类型的“对等”,与您正在处理的不同用例交互(一个客户端连接到GUI,另一个客户端连接到CLI ,另一个有数据库,另一个有SAAS'API等。)。

换句话说,如果您的设计不起作用,请尝试改变您的观点!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM