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() # 开始监听  
时间: 2024-08-25 10:19:59

twisted(转)的相关文章

Python Twisted网络编程框架与异步编程入门教程

原作出处:twisted-intro-cn 作者:Dave 译者:杨晓伟 luocheng likebeta 转载声明:版权归原作出处所有,转载只为让更多人看到这部优秀作品合集,如果侵权,请留言告知 感 谢:感谢 杨晓伟 luocheng likebeta 为国内Twisted Coder做的里程碑级贡献 其 它:能访问到Github的童鞋,请访问出处链接.因为出处排版相当棒! 1.Twisted理论基础 2.异步编程初探与reactor模式 3.初次认识Twisted 4.由twisted支持

深入学习twisted(基础)二

上一篇对twisted大致做了介绍以及一些基本的概念. 这一篇从一个python epoll/soket聊天程序开始. 我们要实现的很简单,就是利用epoll实现一个服务端/客户端间的聊天,服务端和客户端可以接收消息的同时,可以利用raw_input,在命令行输入. 我们将socket fd设置为非阻塞的,但是我们知道标准的输入输出io都是阻塞的,我们就开辟一个线程专门处理输入,在主线程进行消息的收发.这样当我们没有输入的时候,raw_input就会阻塞,由我们的主线程进行监听和处理.代码如下:

twisted 6 大话deferred

http://twistedsphinx.funsize.net/projects/core/howto/deferredindepth.html 1. 没有等待,就没有事件.设备的"监听"功能是一切事件的来源. 一句话道明deferred的精髓 Normally, a function would create a deferred and hand it back to you when you request an operation that needs to wait for

python 网络框架twisted基础学习及详细讲解

twisted网络框架的三个基础模块:Protocol, ProtocolFactory, Transport.这三个模块是构成twisted服务器端与客户端程序的基本. Protocol:Protocol对象实现协议内容,即通信的内容协议ProtocolFactory: 是工厂模式的体现,在这里面生成协议Transport: 是用来收发数据,服务器端与客户端的数据收发与处理都是基于这个模块 在windows中安装twisted需要先安装pywin32,自己去下载下就行.随后pip instal

python_如何通过twisted实现数据库异步插入?

如何通过twisted实现数据库异步插入? 1. 导入adbapi 2. 生成数据库连接池 3. 执行数据数据库插入操作 4. 打印错误信息,并排错 #!/usr/bin/python3 import pymysql from twisted.enterprise import adbapi from twisted.internet import reactor def go_insert(cursor, sql): # 对数据库进行插入操作,并不需要commit,twisted会自动帮我co

Python Twisted架构英文版

原作出处:twisted-intro 作者:Dave 转载声明:版权归原作出处所有,转载只为让更多人看到这部优秀作品合集,如果侵权,请留言告知 Twisted Introduction This multi-part series introduces Asynchronous Programming and the Twisted networking framework. In Which We Begin at the Beginning Slow Poetry and the Apoca

flask twisted 结合方案

from flask import Flask, render_template, g app = Flask(__name__) @app.route("/") def index(): return render_template("index.html") # run in under twisted through wsgi from twisted.web.wsgi import WSGIResource from twisted.web.server i

tornado+ansible+twisted+mongodb运维自动化系统开发(一)

前段时间学习了一下ansible的配置管理(http://blog.csdn.net/column/details/ansible.html   anisble配置工具翻译专栏),感觉很强大,就想着把最近看的tornado和twisted和它结合一下做一个webUI 今天动手做了一个demo,目前大概实现的功能是:添加ansible主机,然后单台运行脚本(后续会把playbook和批量运行加上)在这里做一下记录. 用freemind总结了下思路 下面是demo的截图 添加主机,后台完成清单目录的

python之twisted模块安装

Twisted是一个事件驱动的网络框架. 最近开始学习了解Twisted,首先肯定要安装twisted模块. 但是在cmd下执行:pip install twisted 出现了下面的问题:"error:Microsoft Visual C++ 10.0 is required (Unable to find vcvarsall.bat) 我电脑是pyhton3.4环境(python2.7也有),没有装VC++ 10.0,所以根据error提示,我得去装个VC++ 10.0?? 但是我并不想~,于

为什么 Node.js 这么火,而同样异步模式 Python 框架 Twisted 却十几年一直不温不火?

twisted是一个强大的异步网络框架,应用的面也非常广,但是没有这几年才出现的Node.js火,社区.文档也是很少可怜我觉得二者其实在本质上差不多,而且python使用起来还是比较容易一些的 匿名用户 因为,它给了一大部分程序猿幻觉比如前后端统一,脚本也能性能很屌,做Demo搜搜快什么的,但实际上,这仅仅是幻觉罢了…… 正是因为这样的幻觉是“看得到”的,又有一个响当当的干爹Google,因此Node的曝光率远高于后端常规语言就不足为奇了. 论速度,你一个带JIT的跟常规脚本语言的虚拟机比,没到