返回目录


使用Twisted建立你的服务器(2)

1. 使用Twisted建立你的服务器(2)

请求和实例化的顺序是reactor、factory、protocol。但是真实的开发顺序返回是倒过来的,因为你可能最初始得到的需求是要用什么协议,在设计协义时才能了解需要哪些持久数据和在所有的用户请求是需要共享的内容,以及初始化时所需要完成的事务,最终你才能依据你要应用的平台来考虑优化的方法。我们先来看看如何完成一个自己的协议开发以适用于twisted框架。

理解protocol的工作

twisted的protocol是通过异步处理方式来处理数据的。这就意味着protocol会通过事件来进行网络数据的处理,并且在处理中不会进行任何等待。这是一个最简单的Echo协议的代码:

   1 from twisted.internet.protocol import Protocol
   2 
   3 class Echo(Protocol):
   4 
   5     def dataReceived(self, data):
   6         self.transport.write(data)

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

   1 from twisted.internet.protocol import Protocol
   2 
   3 class HelloHD(Protocol):
   4 
   5     def connectionMade(self):
   6         self.transport.write("Hello This is HD's Test protocol\r\n")
   7         self.transport.loseConnection()

这样在用户连接建立时向用户发送一个欢迎消息,然后就断开了与客户机的连接。下面再看一个实现更多事件的协议实现:

   1 from twisted.internet.protocol import Protocol
   2 
   3 class Echo(Protocol):
   4 
   5     def connectionMade(self):
   6         self.factory.numProtocols = self.factory.numProtocols+1
   7         if self.factory.numProtocols > 100:
   8             self.transport.write("Too many connections, try later")
   9             self.transport.loseConnection()
  10 
  11     def connectionLost(self, reason):
  12         self.factory.numProtocols = self.factory.numProtocols-1
  13 
  14     def dataReceived(self, data):
  15         self.transport.write(data)

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

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

   1 from twisted.internet.protocol import Protocol, Factory
   2 from twisted.internet import reactor
   3 
   4 class HelloHD(Protocol):
   5 
   6     def connectionMade(self):
   7         self.transport.write("Hello This is HD's Test protocol\r\n")
   8         self.transport.loseConnection()
   9 
  10 
  11 # 下面就是施展Twisted神奇的代码了
  12 factory = Factory()
  13 factory.protocol = HelloHD
  14 
  15 # 侦听运行于8025端口,最好是一个大于1024的端口
  16 reactor.listenTCP(8025, factory)
  17 reactor.run()

最后的六行代码就可以将你的protocol运行起来,成为一个可测试的daemon运行起来。测试的客户端可以使用你的telnet,用telnet登录到你的服务器的8025端口就可以进行最初级的测试了。这几行代码只需要看看Twisted的文档就能明白它的含义了。之前的reactor的说明中也非常细的说了你可以有的选择和运行方法。


返回目录