最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python的Twisted框架實現(xiàn)一個簡單的服務(wù)器

 更新時間:2015年04月16日 09:51:18   投稿:goldensun  
這篇文章主要介紹了使用Python的Twisted框架實現(xiàn)一個簡單的服務(wù)器,翻譯自Twisted的文檔,需要的朋友可以參考下

預(yù)覽
  twisted是一個被設(shè)計的非常靈活框架以至于能夠讓你寫出非常強大的服務(wù)器。這種靈活的代價是需要好通過好幾個層次來實現(xiàn)你的服務(wù)器, 本文檔描述的是Protocol層,你將在這個層次中執(zhí)行協(xié)議的分析和處理,如果你正在執(zhí)行一個應(yīng)用程序,那么你應(yīng)該在讀過top level的為twisted寫插件一節(jié)中的怎樣開始寫twisted應(yīng)用程序之后閱讀本章。這個文檔只是和TCP,SSL和Unix套接字服務(wù)器有關(guān),同時也將有另一份文檔專門講解UDP。
  你的協(xié)議處理類通常是twisted.internet.protocol.Protocol的子類。許多協(xié)議處理繼承于該類或者比該類更加方便的該類的子類。一個protocol類的實例可能反復(fù)連接,也可能在連接關(guān)閉之后銷毀。這就意味著這些持續(xù)不斷的配置信息不是保存在Protocol中。
   這些持久性的配置被保存在工廠(Factory)類中,這些工廠類通常繼承至twisted.internet.protocol.Factory,默認 的工廠類僅僅是實例化每個Protocol,然后設(shè)置他們的factory屬性為這個默認的工廠實例本身。這就讓每個Protocol都被存儲,然后可能 修改,于是這樣就形成了Protocol的持久性。
   通常為多個端口或網(wǎng)絡(luò)地址提供相同的服務(wù)是非常有用的。這就是為什么Factory不監(jiān)聽連接,并且實際上它不知道關(guān)于網(wǎng)絡(luò)的任何事情???twisted.internet.interfaces.IReactorTCP.listenTCP,另一個IReactor*.listen*獲得 更多的信息。


   本文檔將要講解各個步驟。


Protocol
    如上所述,這里將通過更多代碼的輔助類和函數(shù)來了解它。一個twisted protocl通過異步方式處理數(shù)據(jù)。這就意味著protocol從不等待任何事件。相反的是在事件通過網(wǎng)絡(luò)到達的時候作出響應(yīng)。

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

這是個非常簡單的協(xié)議處理,僅僅是在獲得數(shù)據(jù)的事件中簡單的將接收到的數(shù)據(jù)發(fā)送回去,并沒有對所有的事件進行響應(yīng)。這里有一個Protocol響應(yīng)其他事件的例子如下:

from twisted.internet.protocol import Protocol
class QOTD(Protocol):
 def connectionMade(self):
  self.transport.write("An apple a day keeps the doctor away/r/n") 
  self.transport.loseConnection()

    本Protocl在一個已知的引用剛開始連接上來的時候作出響應(yīng),發(fā)送了一條消息,然后終止了連接connectionMade事件通常是在由于連接對象建立初始連接時觸發(fā),就像上面的QOTD類實際上是RFC865號文檔的一個協(xié)議基類connectionLost事件將在斷開連接的時候觸發(fā)。實例:  
       

<span style="font-family: Monospaced; color: #0000a0;"><strong>PythonCode: </strong></span><table style="width: 100%; height: 20px;" align="center" bgcolor="#e3dfe3" border="1" bordercolor="#9da7ac" cellpadding="0" cellspacing="0"> 
  <tbody><tr><td> 
     <div class="textBackGround" style="font-family:Courier New;font-size:9pt;"><pre><span style="color: blue;">from</span> twisted.internet.protocol <span style="color: blue;">import</span> Protocol 
 <span style="color: blue;">class</span> Echo(Protocol): 
  <span style="color: blue;">def</span> connectionMade(self): 
   self.factory.numProtocols = self.factory.numProtocols+1 
   <span style="color: blue;">if</span> self.factory.numProtocols > 100: 
    self.transport.write(<span style="color: #ff44a2;">"Too many connections, <span style="color: blue;">try</span> later"</span>) 
    self.transport.loseConnection() 
  <span style="color: blue;">def</span> connectionLost(self, reason): 
   self.factory.numProtocols = self.factory.numProtocols-1 
  <span style="color: blue;">def</span> dataReceived(self, data): 
   self.transport.write(data)</pre> 
 </div> 
 </td> 
 </tr> 
 </tbody> 
 </table> 

    本實例中,connectionMade和connectionLost相互協(xié)作工作以保持factory內(nèi)部的活動連接數(shù)量最多為100。每當有用戶協(xié)議連接近來的時候,就先檢測factory內(nèi)部的活動連接數(shù),如果數(shù)量超過100,就發(fā)送連接數(shù)太多等下試的消息,然后斷開連接而connectionLost則在斷開一個協(xié)議的時候觸發(fā),減去factory內(nèi)部的協(xié)議數(shù)量。

Using the Protocol

          在本節(jié),我將要講解怎樣簡單的去測試你的protocol。(想知道如何寫出一個好的twisted的服務(wù)器,請看 <a >Writing Plug-Ins<br>    for Twisted</a>),這里有一個代碼將運行我們上面談?wù)摰腝OTD服務(wù)器:  
   

 <!-- 
 .textBackGround {background-color: #F0F5FD;} 
 --> 
  <span style="font-family: Monospaced; color: #0000a0;"><strong>PythonCode: </strong></span><table style="width: 100%; height: 20px;" align="center" bgcolor="#e3dfe3" border="1" bordercolor="#9da7ac" cellpadding="0" cellspacing="0"> 
  <tbody><tr><td> 
     <div class="textBackGround" style="font-family:Courier New;font-size:9pt;"><pre><span style="color: blue;">from</span> twisted.internet.protocol <span style="color: blue;">import</span> Protocol, Factory 
 <span style="color: blue;">from</span> twisted.internet <span style="color: blue;">import</span> reactor 
 <span style="color: blue;">class</span> QOTD(Protocol): 
  <span style="color: blue;">def</span> connectionMade(self): 
   self.transport.write(<span style="color: #ff44a2;">"An apple a day keeps the doctor away/r/n"</span>) 
   self.transport.loseConnection() 
  
 <span style="color: green;"># Next lines are magic:</span> 
 factory = Factory() 
 factory.protocol = QOTD 
  
 <span style="color: green;"># 8007 <span style="color: blue;">is</span> the port you want to run under. Choose something >1024</span> 
 reactor.listenTCP(8007, factory) 
 reactor.run()</pre> 
 </div> 
 </td> 
 </tr> 
 </tbody> 
 </table> 

    不必擔心最后面的6條代碼,稍后你將會在本文檔中了解到他們。<br> 

Helper Protocols

     大部分protocols依賴于同類別的更低層次的超級類。最受歡迎的互聯(lián)網(wǎng)協(xié)議是基于行,行通常是由CR_LF(回車換行組成)
然而,也有相當一部分協(xié)議是混合的,他們具有線性的基本節(jié)點,也有原始數(shù)據(jù)節(jié)點,比如HTTP/1.1。
     在這樣的情況下,我們可以使用LineReceiver,本協(xié)議類有兩個不同的事件處理方法,lineReceived和rawDataReceived
默認情況下,只有l(wèi)ineReceived會被調(diào)用,每次讀取一行,然而如果setRawMode被調(diào)用,protocol將調(diào)用rawDataReceived
來處理直到setLineMode被調(diào)用。下面有一個簡單的例子說明如何使用lineReceiver:

    PythonCode:             

from twisted.protocols.basic import LineReceiver
class Answer(LineReceiver):
 answers = {'How are you?': 'Fine', None : "I don't know what you mean"}
 def lineReceived(self, line):
  if self.answers.has_key(line):
   self.sendLine(self.answers[line])
  else:
   self.sendLine(self.answers[None])

注意:界定符不是命令行的一部分
其他也有一些不流行的協(xié)議依然存在,比如netstring based 和 a prefixed-message-length

State Machines

     許多twisted protocol handlers需要編寫一個狀態(tài)機來記錄他們當前的狀態(tài),這里有幾點編寫狀態(tài)機的建議:
   1、不要編寫大狀態(tài)機,寧愿去實現(xiàn)一個抽象的狀態(tài)機類
   2、使用python的動態(tài)性質(zhì)去創(chuàng)建沒有限制的狀態(tài)機,比如SMTP客戶端
   3、不要混合特定應(yīng)用程序代碼和協(xié)議處理代碼,當協(xié)議處理器已經(jīng)提出一個特別的具體要求,保持它作為一個方法調(diào)用。

Factories(工廠類)

     如前面所說,通常twisted.internet.protocol.Factory不必子類化就可以開始工作。然而有時候protocol需要具體的
特殊的工廠配置信息或其他需求,在這樣的情況下,就需要進行子類化了。
    對于Factory來說,他只是簡單的實例化特殊的 protocol協(xié)議類,實例化Factory,并且設(shè)置protocol屬性:

    PythonCode:             

from twisted.internet.protocol import Factory
from twisted.protocols.wire import Echo

myFactory = Factory()
myFactory.protocol = Echo

如果需要簡單的去構(gòu)造一個有具體特殊信息的工廠類,那么一個factory函數(shù)是非常有用的:

PythonCode:

class QOTD(Protocol):
 def connectionMade(self):
  self.transport.write(self.factory.quote+'/r/n')
  self.transport.loseConnection()

def makeQOTDFactory(quote=None):
 factory = Factory()
 factory.protocol = QOTD
 factory.quote = quote or 'An apple a day keeps the doctor away'
 return factory


一個Factory有兩個方法以執(zhí)行特定于應(yīng)用程序的建立和拆除(由于一個Factory通常存在,所以常規(guī)下一般不在__init__或者
__del__中給他們分配與回收,有可能太早或太晚)。
下面是一個Factory的例子,本例將允許Protocol寫一個日志文件:   
PythonCode:

from twisted.internet.protocol import Factory
from twisted.protocols.basic import LineReceiver

class LoggingProtocol(LineReceiver):

 def lineReceived(self, line):
  self.factory.fp.write(line+'/n')


class LogfileFactory(Factory):

 protocol = LoggingProtocol

 def __init__(self, fileName):
  self.file = fileName

 def startFactory(self):
  self.fp = open(self.file, 'a')

 def stopFactory(self):
  self.fp.close()

Putting it All Together(綜合)

    現(xiàn)在你已經(jīng)了解了Factory并且想要執(zhí)行QOTD作為一個可配置的quote服務(wù)器是嗎?沒有問題這里就有一個代碼:
    PythonCode:             

from twisted.internet.protocol import Factory, Protocol
from twisted.internet import reactor

class QOTD(Protocol):

 def connectionMade(self):
  self.transport.write(self.factory.quote+'/r/n')
  self.transport.loseConnection()


class QOTDFactory(Factory):

 protocol = QOTD

 def __init__(self, quote=None):
  self.quote = quote or 'An apple a day keeps the doctor away'

reactor.listenTCP(8007, QOTDFactory("configurable quote"))
reactor.run()

就是最后兩句代碼,還需要去理解。
listenTCP是一個將Factory連接到網(wǎng)絡(luò)的方法,他使用了reactor的接口,讓許多不同的循環(huán)處理網(wǎng)絡(luò)代碼,而不需要修改的
最終用戶代碼,就像這樣。如前面所說,如果你想要寫一個好的twisted服務(wù)器,而不是僅僅的20行,那么你需要使用 the Application object.

相關(guān)文章

  • 談?wù)剬ytorch中的forward的理解

    談?wù)剬ytorch中的forward的理解

    這篇文章主要介紹了談?wù)剬ytorch中的forward的理解,在Pytorch中,forward方法是一個特殊的方法,被專門用來進行前向傳播,本文給大家詳細講解,需要的朋友可以參考下
    2023-04-04
  • 基于h5py的使用及數(shù)據(jù)封裝代碼

    基于h5py的使用及數(shù)據(jù)封裝代碼

    今天小編就為大家分享一篇基于h5py的使用及數(shù)據(jù)封裝代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python數(shù)據(jù)處理Filter函數(shù)高級用法示例

    Python數(shù)據(jù)處理Filter函數(shù)高級用法示例

    本文將詳細介紹filter函數(shù)的使用方法,并提供豐富的示例代碼,幫助你深入理解如何利用它來處理數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • python字典多條件排序方法實例

    python字典多條件排序方法實例

    這篇文章主要介紹了python字典多條件排序方法實例,分別使用lambda和itemgetter實現(xiàn),需要的朋友可以參考下
    2014-06-06
  • 解決pyinstaller 打包exe文件太大,用pipenv 縮小exe的問題

    解決pyinstaller 打包exe文件太大,用pipenv 縮小exe的問題

    這篇文章主要介紹了解決pyinstaller 打包exe文件太大,用pipenv 縮小exe的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python應(yīng)用03 使用PyQT制作視頻播放器實例

    Python應(yīng)用03 使用PyQT制作視頻播放器實例

    本篇文章主要介紹了Python使用PyQT制作視頻播放器實例,具有一定的參考價值,有興趣的可以了解一下。
    2016-12-12
  • python中的句柄操作的方法示例

    python中的句柄操作的方法示例

    這篇文章主要介紹了python中的句柄操作的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-06-06
  • python中mechanize庫的簡單使用示例

    python中mechanize庫的簡單使用示例

    最近的項目中使用到了mechanize庫,下面寫個簡單使用的小例子給大家參考
    2014-01-01
  • Python實現(xiàn)獲取域名所用服務(wù)器的真實IP

    Python實現(xiàn)獲取域名所用服務(wù)器的真實IP

    本文是給大家分享的使用python獲取到域名所在服務(wù)器的真實IP,原因是現(xiàn)在很多的網(wǎng)站都使用了CDN,大家很難直接查到域名的服務(wù)器的IP,本文是使用了一個巧妙的方法,詳情請仔細看看下文吧
    2015-10-10
  • 淺析Python中元祖、列表和字典的區(qū)別

    淺析Python中元祖、列表和字典的區(qū)別

    Python中有三種內(nèi)建的數(shù)據(jù)結(jié)構(gòu):列表、元祖和字典,這篇文章對這三種數(shù)據(jù)結(jié)構(gòu)進行了分別的介紹與實例演示,讓大家更簡潔明了的了解這三個之間的區(qū)別,下面一起來看看。
    2016-08-08

最新評論

武山县| 安泽县| 璧山县| 澎湖县| 巴南区| 新龙县| 北海市| 湖州市| 锡林浩特市| 晴隆县| 乌鲁木齐县| 鄂伦春自治旗| 大渡口区| 九寨沟县| 开阳县| 肇庆市| 陆河县| 罗城| 文化| 五寨县| 静宁县| 滦平县| 河南省| 兖州市| 兰溪市| 布拖县| 九江市| 陇南市| 那坡县| 黎川县| 洪雅县| 马公市| 翁牛特旗| 隆回县| 雅江县| 通州区| 盱眙县| 孝昌县| 平安县| 行唐县| 邮箱|