首页 > 代码库 > twisted(转)
twisted(转)
reactor、protocol 这两个类都在 twisted.internet 命名空间中
reactor对象是Twisted编程当中的第一步,它就是一个反应器,专门负责与服务端的连接以及监听与服务器交互,一旦与服务端连接上以后,即可调用reactor.run()开始监听了,服务器有新的任务或请求传送到客户端的时候,reactor即可监听到,一旦监听到服务端的任务或请求,reactor会将该任务或请求转交给客户端工厂进行处理,一直重复着监听—转交—监听—转交-....... 的工作,直到调用reactor.stop()或者整个程序退出时该监听任务才会退出。
我们来看下reactor是如何连接服务端的,reactor对象提供了个connectTCP(host,port,Factory)方法,该方法带有三个参数;第一个参数是要连接的服务端的ip地址,第二个参数是服务端在监听的端口;既然reactor可以将服务端的任务或请求转交给客户端工厂,那么它必须要有个可以转交的工厂,一个Factory,,第三个参数就是reactor要这个客户端工厂对象,该工厂类必须要继承自 protocol.ClientFactory 类,protocol.ClientFactory类提供了一系列可拓展方法,如buildProtocol、clientConnectionMade、clientConnectionFailed、clientConnectionLost等,你可以通过重写的方式自己实现。
好的,转交工作做完之后,是不是reactor的任务就完成了呢,是的,reactor的任务到此就完成了。但是,任务或请求转交之后,那么谁来处理这些任务或请求呢,这就要交给工厂protocol.ClientFactory 下面的protocol.Protocol来处理了,可以通过protocol.ClientFactory的protocol属性来指定工厂的protocol.Protocol,protocol.Protocol也提供了一系列可拓展的方法,如connectionMade、connectionLost、dataReceived,这里重点讲下dataReceived方法,它有个data参数,该参数就是从服务端传送至客户端的数据,你可以通过重写该方法的方式处理接收到的数据,同样也可以通过透明代理 transport.getPeer()来获取数据发送端(这里指服务端)的ip和port。
下面是一个简单的Demo:
#coding=utf-8 from twisted.internet import reactor,protocol # 导入 reactor , protocol class QuickDisconnectProtocol(protocol.Protocol): def connectionMade(self): # 通过 透明代理获取数据发送端主机信息 Ip self.hostInfo = self.transport.getPerr() print "Connected to %s." % self.hostInfo.host self.transport.loseConnection() def dataRecieved(self,data): # 重写 dataRecieved 方法处理接收到的数据 print data % "from host : %s." % self.hostInfo.host def clientConnectionLost(self,connector,reason): print "lost connection: %s" % reason.getErrorMessage() reactor.stop() # 连接断开后终止监听 def clientConnectionFailed(self,connector,reason): print "Connection failed:%s" % reason.getErrorMessage() reactor.stop() # 连接失败后终止监听 class BasicClientFactory(protocol.ClientFactory): # 通过protocol.ClientFactory 的 protocol 属性指定 protocol.Protocol protocol=QuickDisconnectProtocol # 开始连接服务端 reactor.connectTCP("192.168.10.41",80,BasicClientFactory()) reactor.run() # 开始监听
twisted(转)