python twisted ProtocolClientFactory 用法

This is the Twisted Get Poetry Now! client, version 2.0.

NOTE: This should not be used as the basis for production code.

import datetime, optparse

from twisted.internet.protocol import Protocol, ClientFactory

def parse_args():
usage = """usage: %prog [options] [hostname]:port ...
This is the Get Poetry Now! client, Twisted version 2.0.
Run it like this:
python get-poetry.py port1 port2 port3 ...
If you are in the base directory of the twisted-intro package,
you could run it like this:
python twisted-client-2/get-poetry.py 10001 10002 10003
to grab poetry from servers on ports 10001, 10002, and 10003.
Of course, there need to be servers listening on those ports
for that to work.
"""

parser = optparse.OptionParser(usage)

_, addresses = parser.parse_args()

if not addresses:
    print parser.format_help()
    parser.exit()

def parse_address(addr):
    if ':' not in addr:
        host = '127.0.0.1'
        port = addr
    else:
        host, port = addr.split(':', 1)

    if not port.isdigit():
        parser.error('Ports must be integers.')

    return host, int(port)

return map(parse_address, addresses)

class PoetryProtocol(Protocol):

poem = ''
task_num = 0

def dataReceived(self, data):
    self.poem += data
    msg = 'Task %d: got %d bytes of poetry from %s'
    print  msg % (self.task_num, len(data), self.transport.getPeer())

def connectionLost(self, reason):
    self.poemReceived(self.poem)

def poemReceived(self, poem):
    self.factory.poem_finished(self.task_num, poem)

class PoetryClientFactory(ClientFactory):

task_num = 1

protocol = PoetryProtocol # tell base class what proto to build

def __init__(self, poetry_count):
    self.poetry_count = poetry_count
    self.poems = {} # task num -> poem

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

def poem_finished(self, task_num=None, poem=None):
    if task_num is not None:
        self.poems[task_num] = poem

    self.poetry_count -= 1

    if self.poetry_count == 0:
        self.report()
        from twisted.internet import reactor
        reactor.stop()

def report(self):
    for i in self.poems:
        print 'Task %d: %d bytes of poetry' % (i, len(self.poems[i]))

def clientConnectionFailed(self, connector, reason):
    print 'Failed to connect to:', connector.getDestination()
    self.poem_finished()

def poetry_main():
addresses = parse_args()

start = datetime.datetime.now()

factory = PoetryClientFactory(len(addresses))

from twisted.internet import reactor

for address in addresses:
    host, port = address
    reactor.connectTCP(host, port, factory)

reactor.run()

elapsed = datetime.datetime.now() - start

print 'Got %d poems in %s' % (len(addresses), elapsed)

if name == 'main':
poetry_main()

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 终于,今天,L要结婚了。我们仨,就这样,圆满了。 曾经,我们天不怕地不怕,甚至想过要一起浪迹天涯。花样的青春,我们...
    磨墨的墨墨阅读 269评论 0 0
  • 南京路,外滩,城隍庙都太喧嚣。这次选择去多伦路看一看当年的文人居住的地方。 未完待续。
    Nemo2阅读 210评论 0 0
  • GoAccess旨在成为一个基于终端的快速日志分析器,其核心思想是实时快速分析和查看Web服务器统计信息,GoAc...
    drong哥阅读 360评论 0 0