Chinaunix首页 | 论坛 | 博客
  • 博客访问: 42181
  • 博文数量: 10
  • 博客积分: 1420
  • 博客等级: 上尉
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-22 15:28
文章分类

全部博文(10)

文章存档

2009年(3)

2008年(7)

我的朋友

分类: Python/Ruby

2009-06-01 22:27:09

   开发一个Twisted应用,实质上会关注三个层次的对象。它们互相可配置,可独立开发,只需要通过简单的调用配置就可结合使用。第一层次就是侦听的建立、工厂的初始化、服务器的运行,它需要reactor(反应堆)的开发。第二个层次就是服务的初始化、用户连接的建立、持久配置数据的存储、协议的实例化,它需要factory(工厂)的开发。第三个层次就是用户连接建立后的事件处理,这就需要protocol(协议)的开发了。 
   建立服务器的第一个要解决的问题就是服务与外界的交流协议。协议的定义在twisted中是通过继承twisted.internet.protocol.Protocol类来实现的。在协议中你可以定义连接、数据接收、断开连接等一系列的事件如果进行响应。但是对于所有连接上来的协议的建立、持久配置数据的存储这样的内容并不会保存在协议中。持久配置数据的存储通常都会保存在工厂里。
   工厂的定义在twisted中是通过继承twisted.internet.protocol.Factory类来实现的。twisted提供了缺省的工厂实现最为普通的需求。它会实例化每个协议,并且通过设置每个协议中factory属性来使协议可以使用到它自己,做这个设置的作用就是让协议在进行处理连接数据时可以使用到工厂中存储的持久配置数据。工厂的启动是需要reactor真实的建立侦听并启动才可以实现的。
   协议和工厂最终都会由reactor的侦听建立和run来统一调度起来。 
   请求和实例化的顺序是reactor、factory、protocol。但是真实的开发顺序是倒过来的,因为你可能根据需求,最初考虑到的是要用什么协议,在设计协义时才能了解需要哪些持久数据和在所有的用户请求是需要共享的内容,以及初始化时所需要完成的事务,最后才能依据你要应用的平台来考虑优化的方法。    
   
   理解Twisted工作
   twisted的protocol是通过异步处理方式来处理数据的。这就意味着protocol会通过事件来进行网络数据的处理,并且在处理中不会进行任何等待。这是一个最简单的Echo协议的代码:

from twisted.internet.protocol import Protocol  
class Echo(Protocol):  
    def dataReceived(self,data):  
        self.transport.write(data)        

   echo是一个非常简单的协议,它所做的事就是将客户机发过来的数据完整的反回给客户端。这里它没有响应所有的方法,但是也是一个可以使用并且运行的协议。下面的代码响应了另一个事件:    

from twisted.internet.protocol import Protocol  
class HelloHD(Protocol):  
    def connectionMade(self):  
        self.transport.write("Hello This is HD's Test protocol\r\n")  
        self.transport.loseConnection()  
   这样在用户连接建立时向用户发送一个欢迎消息,然后就断开了与客户机的连接。下面再看一个实现更多事件的协议实现: 
       
from twisted.internet.protocol import Protocol  
class Echo(Protocol):  
    def connectionMade(self):  
        self.factory.numProtocols = self.factory.numProtocols+1  
        if self.factory.numProtocols > 100:  
            self.transport.write("Too many connections,try later")  
            self.transport.loseConnection()  
    def connectionLost(self,reason):  
        self.factory.numProtocols = self.factory.numProtocols-1  
    def dataReceived(self, data):  
        self.transport.write(data)    

   这里不但向应了三个事件:连接初始化、断开连接、接收到数据。而且还使用了factory来存储一个持久的数据(当前并发的用户连接数)。       

   使用protocol做完一个rptocol的开发如何让它放入一个可以测试的环境中试验呢?以下是一个最为简单的办法进行测试:    

# -*- coding: utf-8 -*-
#!/usr/bin/env python
from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor
class QOTD(Protocol):
    def connectionMade(self):
        self.transport.write("An apple a day keeps the doctor away\r\n")
        self.transport.loseConnection()
factory = Factory()
factory.protocol = QOTD
reactor.listenTCP(8080, factory)
reactor.run() 
  
   最后的六行代码就可以将你的protocol运行起来,成为一个可测试的daemon运行起来。测试的客户端可以使用你的telnet,用telnet登录到你的服务器的8080端口就可以进行最初级的测试了。这几行代码只需要看看Twisted的文档就能明白它的含义了。之前的reactor的说明中也非常细的说了你可以有的选择和运行方法。
阅读(906) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~