Python的Twisted入门

xiaoxiao2021-02-28  10

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,reactor from time import ctime port=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=Ser print '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,reactor host='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进行连接,事件循环

转载请注明原文地址: https://www.6miu.com/read-850080.html

最新回复(0)