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(转)的更多相关文章

  1. Mina、Netty、Twisted一起学(八):HTTP服务器

    HTTP协议应该是目前使用最多的应用层协议了,用浏览器打开一个网站就是使用HTTP协议进行数据传输. HTTP协议也是基于TCP协议,所以也有服务器和客户端.HTTP客户端一般是浏览器,当然还有可能是 ...

  2. Twisted随笔

    学习了socket后决定尝试使用框架,目标锁定了Twisted. 什么是Twisted? twisted是一个用python语言写的事件驱动的网络框架,他支持很多种协议,包括UDP,TCP,TLS和其 ...

  3. Python 安装Twisted 提示python version 2.7 required,which was not found in the registry

    由于我安装Python64位的,下载后没注册,安装Twisted时老提示“python version 2.7 required,which was not found in the registry ...

  4. Python - twisted web 入门学习之一

    原文地址:http://zhouzhk.iteye.com/blog/765884 python的twisted框架中带了一个web server: twisted web.现在看看怎么用. 一)准备 ...

  5. Twisted

    Twisted是一个事件驱动的网络框架,其中包含了诸多功能,例如网络协议,线程,数据库管理,网络操作,电子邮件等 事件驱动 一,注册事件 二,触发事件 自定义事件框架  event_fram.py # ...

  6. Mina、Netty、Twisted一起学(十):线程模型

    要想开发一个高性能的TCP服务器,熟悉所使用框架的线程模型非常重要.MINA.Netty.Twisted本身都是高性能的网络框架,如果再搭配上高效率的代码,才能实现一个高大上的服务器.但是如果不了解它 ...

  7. Mina、Netty、Twisted一起学(九):异步IO和回调函数

    用过JavaScript或者jQuery的同学都知道,JavaScript特别是jQuery中存在大量的回调函数,例如Ajax.jQuery的动画等. $.get(url, function() { ...

  8. Mina、Netty、Twisted一起学(七):发布/订阅(Publish/Subscribe)

    消息传递有很多种方式,请求/响应(Request/Reply)是最常用的.在前面的博文的例子中,很多都是采用请求/响应的方式,当服务器接收到消息后,会立即write回写一条消息到客户端.HTTP协议也 ...

  9. Mina、Netty、Twisted一起学(六):session

    开发过Web应用的同学应该都会使用session.由于HTTP协议本身是无状态的,所以一个客户端多次访问这个web应用的多个页面,服务器无法判断多次访问的客户端是否是同一个客户端.有了session就 ...

  10. Mina、Netty、Twisted一起学(五):整合protobuf

    protobuf是谷歌的Protocol Buffers的简称,用于结构化数据和字节码之间互相转换(序列化.反序列化),一般应用于网络传输,可支持多种编程语言. protobuf如何使用这里不再介绍, ...

随机推荐

  1. java基础之BigDecimal类

    由于在运算的时候,float类型和double很容易丢失精度,演示案例.所以,为了能精确的表示.计算浮点数,Java提供了BigDecimal BigDecimal类概述 不可变的.任意精度的有符号十 ...

  2. Python学习之--函数/生成器/装饰器

    Function,函数,主要是为了:1提高代码的复用程度,2将程序模块化. 定义函数 在Python中,使用def 用来定义函数,一般函数的定义如下: def name(arg1,arg2,....) ...

  3. Selenium浏览器自动化测试使用(2)

    Selenium - 环境安装设置 为了开发Selenium RC或webdriver脚本,用户必须确保他们有初始配置完成.有很多关联建立环境的步骤.这里将通过详细的讲解. 下载并安装Java 下载并 ...

  4. 04.Hibernate常用的接口和类---SessionFactory类和作用

    是一个生成Session的工厂类 特点: 1.由Configuration通过加载配置文件创建该对象. SessionFactory factory = config.buildSessionFact ...

  5. 全栈之路-微信小程序-SKU开发(代码)

    SKU开发是小程序中最难的一部分,思路在分析中已经记录过了,这里主要看一下代码的实现,感觉老师写的代码太棒了,很优雅!主要想记录一下写代码的思路,对面向对象编程的实践. 一.代码结构的分析 1.说明几 ...

  6. 1008-Redo

    关于flag,都立下了 T1 考试的时候就觉得是贪心,但是不会反悔emm…… 于是正解就是一个堆优化可反悔的贪心=.= 每次找前面最小的,于是是小根堆. 我们在交易的时候发现后面的一个可以更优. 于是 ...

  7. SQL Server 2008 分区函数和分区表

      当我们数据量比较大的时候,我们需要将大型表拆分为多个较小的表,则只访问部门数据的查询就可以更快的运行,基本原理就是,因为要扫描的数据变的更小.维护任务(例如,重新生成索引或备份表)也可以更快的运行 ...

  8. PAT甲级——A1020 Tree Traversals

    Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and i ...

  9. Result结果类型详解

    配置Result 在 struts.xml 文件中,<result> 元素用于配置 Result 逻辑视图与物理视图之间的映射关系,它有两个可选属性 name 和 type.其中,name ...

  10. 【One by one系列】一步步部署.net core应用

    我们的目标: CentOS系统 nginx服务器 asp.net core应用 mysql服务器 腾讯云服务器 工具准备 [Xshell]--使用windwos下的工具Xshell,原理就是使用SHH ...