zoukankan      html  css  js  c++  java
  • 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() # 开始监听  
  • 相关阅读:
    poj 3068 Bridge Across Islands
    XidianOJ 1086 Flappy v8
    XidianOJ 1036 分配宝藏
    XidianOJ 1090 爬树的V8
    XidianOJ 1088 AK后的V8
    XidianOJ 1062 Black King Bar
    XidianOJ 1091 看Dota视频的V8
    XidianOJ 1098 突击数论前的xry111
    XidianOJ 1019 自然数的秘密
    XidianOJ 1109 Too Naive
  • 原文地址:https://www.cnblogs.com/zhenfei/p/6502042.html
Copyright © 2011-2022 走看看