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()启动事件循环。
简单入门:
服务端:
"""
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进行端口监听以及时间循环
客户端:
"""
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进行连接,事件循环