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() # 开始监听  
  • 相关阅读:
    LeetCode之移除元素
    有被开心到hh(日常)
    交换排序
    插入排序
    顺序查找&折半查找
    C++之引用
    MySQL学习笔记
    C/C++程序编译过程
    计算机面试知识整合(更新中...)
    MFC之编辑框
  • 原文地址:https://www.cnblogs.com/zhenfei/p/6502042.html
Copyright © 2011-2022 走看看