Python的Twisted入门

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进行连接,事件循环
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值