Python Twisted 客户端连接丢失

4 投票
1 回答
3085 浏览
提问于 2025-04-16 09:01

我有一个叫做“twisted”的客户端,它可以连接到一个有索引的“twisted”服务器。我是通过命令行运行这个客户端的,运行得很顺利。后来我修改了它,让它可以循环运行(见main()),这样我就可以不断地查询。但是现在客户端只运行了一次。下一次它就直接显示connection lost \n Connection lost - goodbye!

我哪里做错了呢?在循环中我重新连接服务器,这样做不对吗?

from twisted.internet import reactor
from twisted.internet import protocol

from settings import AS_SERVER_HOST, AS_SERVER_PORT

# a client protocol
class Spell_client(protocol.Protocol):
    """Once connected, send a message, then print the result."""

    def connectionMade(self):
        self.transport.write(self.factory.query)

    def dataReceived(self, data):
        "As soon as any data is received, write it back."
        if data == '!':
            self.factory.results = ''
        else:
            self.factory.results = data
        self.transport.loseConnection()

    def connectionLost(self, reason):
        print "\tconnection lost"

class Spell_Factory(protocol.ClientFactory):
    protocol = Spell_client

    def __init__(self, query):
        self.query   = query
        self.results = ''

    def clientConnectionFailed(self, connector, reason):
        print "\tConnection failed - goodbye!"
        reactor.stop()

    def clientConnectionLost(self, connector, reason):
        print "\tConnection lost - goodbye!"
        reactor.stop()

# this connects the protocol to a server runing on port 8090
def main(): 
    print 'Connecting to %s:%d' % (AS_SERVER_HOST, AS_SERVER_PORT)
    while True:
        print
        query = raw_input("Query:")
        if query == '': return
        f = Spell_Factory(query) 
        reactor.connectTCP(AS_SERVER_HOST, AS_SERVER_PORT, f)
        reactor.run()
        print f.results
    return

if __name__ == '__main__':
    main()

1 个回答

4

你可能不太明白Twisted的反应堆是怎么工作的。

reactor.run() 是在启动反应堆的事件循环——这是一种会一直“阻塞”的调用,意思是它会不停地运行下去。

想了解更多关于反应堆的内容,可以查看这个链接:http://twistedmatrix.com/documents/10.2.0/core/howto/reactor-basics.html

撰写回答