在这个blog上学习twisted。
[url]http://blog.163.com/gzjck_gshock/blog/static/77206203201291461538770/[/url]
里面的一个关于DeferredList的例子一开始对语法不太理解,copy并run了一遍就理解了,把代码贴在这里留作以后借鉴。
connecttest.py:
portscan.py
执行脚本连接localhost:
$python portscan.py 127.0.0.1
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(True, 'Connected!')
Connected to port 8007
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
我将DeferredList中的每个Deferred打印出来就看懂handleAllResults()中的resultInfo是什么了。
[url]http://blog.163.com/gzjck_gshock/blog/static/77206203201291461538770/[/url]
里面的一个关于DeferredList的例子一开始对语法不太理解,copy并run了一遍就理解了,把代码贴在这里留作以后借鉴。
connecttest.py:
from twisted.internet import reactor, defer, protocol
class CallbackAndDisconnectProtocol(protocol.Protocol):
def connectionMade(self):
self.factory.deferred.callback("Connected!")
self.transport.loseConnection( )
class ConnectionTestFactory(protocol.ClientFactory):
protocol = CallbackAndDisconnectProtocol
def __init__(self):
self.deferred = defer.Deferred( )
def clientConnectionFailed(self, connector, reason):
self.deferred.errback(reason)
def testConnect(host, port):
testFactory = ConnectionTestFactory( )
reactor.connectTCP(host, port, testFactory)
return testFactory.deferred
def handleSuccess(result, port):
print "Connected to port %i" % port
reactor.stop( )
def handleFailure(failure, port):
print "Error connecting to port %i: %s" % (
port, failure.getErrorMessage( ))
reactor.stop( )
if __name__ == "__main__":
import sys
if not len(sys.argv) == 3:
print "Usage: connectiontest.py host port"
sys.exit(1)
host = sys.argv[1]
port = int(sys.argv[2])
connecting = testConnect(host, port)
connecting.addCallback(handleSuccess, port)
connecting.addErrback(handleFailure, port)
reactor.run( )
portscan.py
from twisted.internet import reactor, defer
from connecttest import testConnect
def handleAllResults(results, ports):
for port, resultInfo in zip(ports, results):
print resultInfo
success, result = resultInfo
if success:
print "Connected to port %i" % port
reactor.stop( )
import sys
host = sys.argv[1]
ports = range(8000, 8010)
testers = [testConnect(host, port) for port in ports]
defer.DeferredList(testers, consumeErrors=True).addCallback(
handleAllResults, ports)
reactor.run( )
执行脚本连接localhost:
$python portscan.py 127.0.0.1
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(True, 'Connected!')
Connected to port 8007
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
(False, <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>)
我将DeferredList中的每个Deferred打印出来就看懂handleAllResults()中的resultInfo是什么了。