博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python的Twisted入门
阅读量:2439 次
发布时间:2019-05-10

本文共 2441 字,大约阅读时间需要 8 分钟。

Python的Twisted入门

Twisted基本模型

Twisted网络编程框架是一种基于事件的网络编程框架,用户需要继承特定的类,并重载其中的方法来处理网络通信中可能出现的各种情况。Twisted的网络通信模型最基本的也要由三部分组成:反应器(reactor)、协议(protocol)、工厂(factory)。其中反应器用来执行事件循环,分发事件处理等等,每个应用程序中一般只能启动一个reactor。协议用来完成与一个已经连接成功的主机的交互功能,主要有数据的接收和发送功能。连接的断开事件也可以在这里处理。工厂负责与一个协议的启动和关闭功能,而且还负责在连接成功时生成一个协议对象,(by gashero)用于与远程主机的交互功能。

一个典型的Twisted应用程序会建立至少一个协议,可以从twisted.internet.protocol.BaseProtocol类或其子类继承。协议还需要实现数据的接收处理,即收到数据之后需要做出何种响应。比较简单的Twisted应用程序可以继承一个空的工厂,来自twisted.internet.protocol.Factory或其子类。工厂至少应该指定protocol属性,指向协议类。最后就是要启动事件循环,根据连接方向的不同,可以选择用reactor的connectXXX()或listenXXX()方法,然后执行reactor.run()启动事件循环。

简单入门:

服务端:

#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time    : 2017/7/27 20:33# @File    : ser1.py"""twisted 服务端"""from twisted .internet import protocol,reactorfrom time import ctimeport=6674#协议类class Ser(protocol.Protocol):    #对新的连接做处理    def connectionMade(self):        clnt=self.clnt=self.transport.getPeer().host#获取连接进来的客户端的地址        print 'connect from',clnt #打印地址    #数据处理    def dataReceived(self, data):        self.transport.write('[%s] %s' % (ctime(),data))factory=protocol.Factory()  #生成具体工厂对象factory.protocol=Serprint 'waiting'reactor.listenTCP(port,factory)   #注册监听reactor.run()  #事件循环

1 先定义一个协议类,通过继承protocol.Protocol来实现。再重写里面的connectionMade方法和 dataReceived方法

connectionMade方法可以对新的连接做出回应

dataReceived方法每当收到数据时调用,其中可以添加自己的业务逻辑

self.transport对象,这个是所有的协议对象都有的成员,可以看出是从BaseProtocol就已经存在的。,其中write方法以非阻塞方式将一些数据以序列的形式写入物理连接。

2 生成工厂对象,Factory的工作是管理连接事件,并且创建Protocol对象处理每一个成功的连接。并且把先前定义好的协议赋予具体工厂对象

3 调用reactor进行端口监听以及时间循环

客户端:

#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time    : 2017/7/27 20:41# @File    : cli1.py"""twisted 客户端"""from twisted.internet import protocol,reactorhost='127.0.0.1'port=6674#协议类class Client(protocol.Protocol):    #自定义的方法,进行数据传送    def sendData(self):        data=raw_input('>>>')        if data:            print 'send %s' % data            self.transport.write(data)        else:            self.transport.loseConnection()        #连接后便发送数据    def connectionMade(self):        self.sendData()    def dataReceived(self, data):        print data        self.sendData()class Fac(protocol.ClientFactory):    protocol=Client    clientConnectionLost =  clientConnectionFailed = \    lambda self,connector,reason:reactor.stop()reactor.connectTCP(host,port,Fac())reactor.run()

1 定义协议类

2 实现工厂对象,此处通过继承protocol.ClientFactory来实现

ClientFactory为客户提供的协议工厂。这可以与reactor中的各种连接方法一起使用。

3 reactor进行连接,事件循环

转载地址:http://ntcqb.baihongyu.com/

你可能感兴趣的文章
如何在Ubuntu 18.04上安装Nginx
查看>>
如何在Ubuntu 20.04上安装Nginx
查看>>
如何构建和安装Go程序
查看>>
如何在Ubuntu 18.04上安装MySQL
查看>>
如何使用Node.js抓取网站
查看>>
锂离子电容_离子,电容和Android Studio
查看>>
用switch语句编写程序_如何在Go中编写switch语句
查看>>
ionic devapp_Ionic 4:使用Ionic DevApp进行实时设备上测试
查看>>
react应用添加依赖_将Sound FX添加到您的React应用中
查看>>
golang 数组和切片_了解Go中的数组和切片
查看>>
ansible权威指南_如何使用Ansible:参考指南
查看>>
git克隆github_如何使用Git和Github分叉,克隆和推送更改
查看>>
golang中使用指针_了解Go中的指针
查看>>
盖茨比乔布斯_使用盖茨比的useStaticQuery挂钩的快速指南
查看>>
如何在Go中定义和调用函数
查看>>
react 分页_如何使用React构建自定义分页
查看>>
angular 模块构建_使用传单在Angular中构建地图,第4部分:形状服务
查看>>
服务周期性工作内容_使服务工作者生命周期神秘化
查看>>
如何在Ubuntu 20.04上安装TensorFlow
查看>>
react项目设置全局变量_如何使用宗地设置React项目
查看>>