欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用Python的Twisted框架實(shí)現(xiàn)一個(gè)簡(jiǎn)單的服務(wù)器

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

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


   本文檔將要講解各個(gè)步驟。


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

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

這是個(gè)非常簡(jiǎn)單的協(xié)議處理,僅僅是在獲得數(shù)據(jù)的事件中簡(jiǎn)單的將接收到的數(shù)據(jù)發(fā)送回去,并沒(méi)有對(duì)所有的事件進(jìn)行響應(yīng)。這里有一個(gè)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在一個(gè)已知的引用剛開(kāi)始連接上來(lái)的時(shí)候作出響應(yīng),發(fā)送了一條消息,然后終止了連接connectionMade事件通常是在由于連接對(duì)象建立初始連接時(shí)觸發(fā),就像上面的QOTD類(lèi)實(shí)際上是RFC865號(hào)文檔的一個(gè)協(xié)議基類(lèi)connectionLost事件將在斷開(kāi)連接的時(shí)候觸發(fā)。實(shí)例:  
       

<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> 

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

Using the Protocol

          在本節(jié),我將要講解怎樣簡(jiǎn)單的去測(cè)試你的protocol。(想知道如何寫(xiě)出一個(gè)好的twisted的服務(wù)器,請(qǐng)看 <a >Writing Plug-Ins<br>    for Twisted</a>),這里有一個(gè)代碼將運(yùn)行我們上面談?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> 

    不必?fù)?dān)心最后面的6條代碼,稍后你將會(huì)在本文檔中了解到他們。<br> 

Helper Protocols

     大部分protocols依賴于同類(lèi)別的更低層次的超級(jí)類(lèi)。最受歡迎的互聯(lián)網(wǎng)協(xié)議是基于行,行通常是由CR_LF(回車(chē)換行組成)
然而,也有相當(dāng)一部分協(xié)議是混合的,他們具有線性的基本節(jié)點(diǎn),也有原始數(shù)據(jù)節(jié)點(diǎn),比如HTTP/1.1。
     在這樣的情況下,我們可以使用LineReceiver,本協(xié)議類(lèi)有兩個(gè)不同的事件處理方法,lineReceived和rawDataReceived
默認(rèn)情況下,只有l(wèi)ineReceived會(huì)被調(diào)用,每次讀取一行,然而如果setRawMode被調(diào)用,protocol將調(diào)用rawDataReceived
來(lái)處理直到setLineMode被調(diào)用。下面有一個(gè)簡(jiǎn)單的例子說(shuō)明如何使用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需要編寫(xiě)一個(gè)狀態(tài)機(jī)來(lái)記錄他們當(dāng)前的狀態(tài),這里有幾點(diǎn)編寫(xiě)狀態(tài)機(jī)的建議:
   1、不要編寫(xiě)大狀態(tài)機(jī),寧愿去實(shí)現(xiàn)一個(gè)抽象的狀態(tài)機(jī)類(lèi)
   2、使用python的動(dòng)態(tài)性質(zhì)去創(chuàng)建沒(méi)有限制的狀態(tài)機(jī),比如SMTP客戶端
   3、不要混合特定應(yīng)用程序代碼和協(xié)議處理代碼,當(dāng)協(xié)議處理器已經(jīng)提出一個(gè)特別的具體要求,保持它作為一個(gè)方法調(diào)用。

Factories(工廠類(lèi))

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

    PythonCode:             

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

myFactory = Factory()
myFactory.protocol = Echo

如果需要簡(jiǎn)單的去構(gòu)造一個(gè)有具體特殊信息的工廠類(lèi),那么一個(gè)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


一個(gè)Factory有兩個(gè)方法以執(zhí)行特定于應(yīng)用程序的建立和拆除(由于一個(gè)Factory通常存在,所以常規(guī)下一般不在__init__或者
__del__中給他們分配與回收,有可能太早或太晚)。
下面是一個(gè)Factory的例子,本例將允許Protocol寫(xiě)一個(gè)日志文件:   
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作為一個(gè)可配置的quote服務(wù)器是嗎?沒(méi)有問(wèn)題這里就有一個(gè)代碼:
    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是一個(gè)將Factory連接到網(wǎng)絡(luò)的方法,他使用了reactor的接口,讓許多不同的循環(huán)處理網(wǎng)絡(luò)代碼,而不需要修改的
最終用戶代碼,就像這樣。如前面所說(shuō),如果你想要寫(xiě)一個(gè)好的twisted服務(wù)器,而不是僅僅的20行,那么你需要使用 the Application object.

相關(guān)文章

  • python pandas分組聚合詳細(xì)

    python pandas分組聚合詳細(xì)

    分組聚合是數(shù)據(jù)處理中常見(jiàn)的場(chǎng)景,在pandas中用groupby方法實(shí)現(xiàn)分組操作,用agg方法實(shí)現(xiàn)聚合操作,在這篇文章里有主要介紹,感興趣的朋友請(qǐng)參考下文
    2021-09-09
  • 在Python中實(shí)現(xiàn)決策樹(shù)算法的示例代碼

    在Python中實(shí)現(xiàn)決策樹(shù)算法的示例代碼

    決策樹(shù)(Decision Tree)是一種常見(jiàn)的機(jī)器學(xué)習(xí)算法,被廣泛應(yīng)用于分類(lèi)和回歸任務(wù)中,并且再其之上的隨機(jī)森林和提升樹(shù)等算法一直是表格領(lǐng)域的最佳模型,所以本文將介紹理解其數(shù)學(xué)概念,并在Python中動(dòng)手實(shí)現(xiàn),這可以作為了解這類(lèi)算法的基礎(chǔ)知識(shí)
    2023-08-08
  • Python?安裝教程以及快速入門(mén)

    Python?安裝教程以及快速入門(mén)

    Python是一種簡(jiǎn)單易學(xué)的編程語(yǔ)言,適合初學(xué)者入門(mén)。本文將介紹Python的安裝教程以及快速入門(mén),幫助讀者快速上手Python編程。
    2023-09-09
  • Python反射機(jī)制案例超詳細(xì)講解

    Python反射機(jī)制案例超詳細(xì)講解

    反射就是通過(guò)字符串的形式,導(dǎo)入模塊;通過(guò)字符串的形式,去模塊尋找指定函數(shù),并執(zhí)行。利用字符串的形式去對(duì)象(模塊)中操作(查找/獲取/刪除/添加)成員,一種基于字符串的事件驅(qū)動(dòng)
    2022-09-09
  • Python實(shí)現(xiàn)完全數(shù)的示例詳解

    Python實(shí)現(xiàn)完全數(shù)的示例詳解

    完全數(shù),又稱(chēng)完美數(shù),定義為:這個(gè)數(shù)的所有因數(shù)(不包括這個(gè)數(shù)本身)加起來(lái)剛好等于這個(gè)數(shù)。本文就來(lái)用Python實(shí)現(xiàn)計(jì)算完全數(shù),需要的可以參考一下
    2023-01-01
  • 對(duì)PyTorch中inplace字段的全面理解

    對(duì)PyTorch中inplace字段的全面理解

    這篇文章主要介紹了對(duì)PyTorch中inplace字段的全面理解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python3實(shí)現(xiàn)隨機(jī)數(shù)

    python3實(shí)現(xiàn)隨機(jī)數(shù)

    這篇文章主要為大家詳細(xì)介紹了python3實(shí)現(xiàn)隨機(jī)數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 詳解如何用Python模擬登錄淘寶

    詳解如何用Python模擬登錄淘寶

    最近想爬取淘寶的一些商品,但是發(fā)現(xiàn)如果要使用搜索等一些功能時(shí)基本都需要登錄,所以就想出一篇模擬登錄淘寶的文章!本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • python腳本實(shí)現(xiàn)音頻m4a格式轉(zhuǎn)成MP3格式的實(shí)例代碼

    python腳本實(shí)現(xiàn)音頻m4a格式轉(zhuǎn)成MP3格式的實(shí)例代碼

    這篇文章主要介紹了python腳本實(shí)現(xiàn)音頻m4a格式轉(zhuǎn)成MP3格式的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Python八大常見(jiàn)排序算法定義、實(shí)現(xiàn)及時(shí)間消耗效率分析

    Python八大常見(jiàn)排序算法定義、實(shí)現(xiàn)及時(shí)間消耗效率分析

    這篇文章主要介紹了Python八大常見(jiàn)排序算法定義、實(shí)現(xiàn)及時(shí)間消耗效率分析,結(jié)合具體實(shí)例形式對(duì)比分析了冒泡排序、直接插入排序、選擇排序、歸并排序、希爾排序、桶排序、堆排序等排序算法的使用與執(zhí)行效率,需要的朋友可以參考下
    2018-04-04

最新評(píng)論