python twisted 建立服務器

(注:本文檔非原創,僅作爲自己參考)

1. 使用Twisted建立你的服務器(1)
Twisted不只是在性能和環境的多樣適應性上精益求精,它最重要的一個突破在於使用組件化的方式開發網絡應用程序。可以讓大家審視自己最爲關注的重點,而忽略一些輔助性的事務。當幾名開發人員將自己的成果完成時,匯聚到一起就能成爲一個強大的系統。當然,需要技巧來進行這之中的協調,協調的基礎是我們自己必須瞭解這樣的過程和它們之間的接口關聯。 

最爲簡單的情況下,除了瞭解清reactor的簡單使用,你還要了解Protocol和Factory。它們最終都會由reactor的偵聽建立和run來統一調度起來。 

建立服務器的第一個要解決的問題就是服務與外界的交流協議。協議的定義在twisted中是通過繼承twisted.internet.protocol.Protocol類來實現的。在協議中你可以定義連接、數據接收、斷開連接等一系列的事件如果進行響應。但是對於所有連接上來的協議的建立、持久配置數據的存儲這樣的內容並不會保存在協議中。 

持久配置數據的存儲通常都會保存在工廠裏。 

工廠的定義在twisted中是通過繼承twisted.internet.protocol.Factory類來實現的。twisted提供了缺省的工廠實現最爲普通的需求。它會實例化每個協議,並且通過設置每個協議中factory屬性來使協議可以使用到它自己,做這個設置的作用就是讓協議在進行處理連接數據時可以使用到工廠中存儲的持久配置數據。工廠的啓動是需要reactor真實的建立偵聽並啓動纔可以實現的。 

reactor偵聽的建立可以參考 twisted.internet.interfaces.IReactorTCP.listenTCP。這時我們先只說建立TCP服務器的偵聽,如果你需要其它種類的偵聽建立參考IReactor*.listen*系列API。 

總結一下,我們書寫一個twisted的Daemon,實質上會關注三個層次的對象。它們互相可配置,可獨立開發,只需要通過簡單的調用配置就可結合使用。第一層次就是偵聽的建立、工廠的初始化、服務器的運行,它需要reactor的開發。第二個層次就是服務的初始化、用戶連接的建立、持久配置數據的存儲、協議的實例化,它需要factory的開發。第三個層次就是用戶連接建立後的事件處理,這就需要protocol的開發了。 



1. 使用Twisted建立你的服務器(2)
請求和實例化的順序是reactor、factory、protocol。但是真實的開發順序返回是倒過來的,因爲你可能最初始得到的需求是要用什麼協議,在設計協義時才能瞭解需要哪些持久數據和在所有的用戶請求是需要共享的內容,以及初始化時所需要完成的事務,最終你才能依據你要應用的平臺來考慮優化的方法。我們先來看看如何完成一個自己的協議開發以適用於twisted框架。 

理解protocol的工作 

twisted的protocol是通過異步處理方式來處理數據的。這就意味着protocol會通過事件來進行網絡數據的處理,並且在處理中不會進行任何等待。這是一個最簡單的Echo協議的代碼: 

Toggle line numbers 
   1 from twisted.internet.protocol import Protocol
   2 
   3 class Echo(Protocol):
   4 
   5     def dataReceived(self, data):
   6         self.transport.write(data)
echo是一個非常簡單的協議,它所做的事就是將客戶機發過來的數據完整的反回給客戶端。這裏它沒有響應所有的方法,但是也是一個可以使用並且運行的協議。下面的代碼響應了另一個事件: 

Toggle line numbers 
   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()
這樣在用戶連接建立時向用戶發送一個歡迎消息,然後就斷開了與客戶機的連接。下面再看一個實現更多事件的協議實現: 

Toggle line numbers 
   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的開發如何讓它放入一個可以測試的環境中試驗呢?以下是一個最爲簡單的辦法進行測試: 

Toggle line numbers 
   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的說明中也非常細的說了你可以有的選擇和運行方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章