twisted(转)

Posted 震撼起飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(转)的主要内容,如果未能解决你的问题,请参考以下文章

几个有用的JavaScript/jQuery代码片段(转)

实用代码片段将json数据绑定到html元素 (转)

如何在kotlin中从一个片段转到另一个片段?

(转) Java中的负数及基本类型的转型详解

web代码片段

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段