激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 使用Python的Twisted框架實現一個簡單的服務器

使用Python的Twisted框架實現一個簡單的服務器

2020-06-07 10:45Python教程網 Python

這篇文章主要介紹了使用Python的Twisted框架實現一個簡單的服務器,翻譯自Twisted的文檔,需要的朋友可以參考下

 

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


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


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

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

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

?
1
2
3
4
5
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在一個已知的引用剛開始連接上來的時候作出響應,發送了一條消息,然后終止了連接connectionMade事件通常是在由于連接對象建立初始連接時觸發,就像上面的QOTD類實際上是RFC865號文檔的一個協議基類connectionLost事件將在斷開連接的時候觸發。實例:  
       

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<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相互協作工作以保持factory內部的活動連接數量最多為100。每當有用戶協議連接近來的時候,就先檢測factory內部的活動連接數,如果數量超過100,就發送連接數太多等下試的消息,然后斷開連接而connectionLost則在斷開一個協議的時候觸發,減去factory內部的協議數量。

Using the Protocol

          在本節,我將要講解怎樣簡單的去測試你的protocol。(想知道如何寫出一個好的twisted的服務器,請看 <a href="http://fantix.org/twisted-doc-zh/nightly/online/howto/plugin.html">Writing Plug-Ins<br>    for Twisted</a>),這里有一個代碼將運行我們上面談論的QOTD服務器:  
   

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!--
.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依賴于同類別的更低層次的超級類。最受歡迎的互聯網協議是基于行,行通常是由CR_LF(回車換行組成)
然而,也有相當一部分協議是混合的,他們具有線性的基本節點,也有原始數據節點,比如HTTP/1.1。
     在這樣的情況下,我們可以使用LineReceiver,本協議類有兩個不同的事件處理方法,lineReceived和rawDataReceived
默認情況下,只有lineReceived會被調用,每次讀取一行,然而如果setRawMode被調用,protocol將調用rawDataReceived
來處理直到setLineMode被調用。下面有一個簡單的例子說明如何使用lineReceiver:

    PythonCode:             

?
1
2
3
4
5
6
7
8
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])

 

 

 

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

State Machines

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

Factories(工廠類)

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

 

    PythonCode:             

?
1
2
3
4
5
from twisted.internet.protocol import Factory
from twisted.protocols.wire import Echo
 
myFactory = Factory()
myFactory.protocol = Echo

 

 

 

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

PythonCode:

 

 

?
1
2
3
4
5
6
7
8
9
10
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有兩個方法以執行特定于應用程序的建立和拆除(由于一個Factory通常存在,所以常規下一般不在__init__或者
__del__中給他們分配與回收,有可能太早或太晚)。
下面是一個Factory的例子,本例將允許Protocol寫一個日志文件:   
PythonCode:

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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(綜合)

    現在你已經了解了Factory并且想要執行QOTD作為一個可配置的quote服務器是嗎?沒有問題這里就有一個代碼:
    PythonCode:             

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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連接到網絡的方法,他使用了reactor的接口,讓許多不同的循環處理網絡代碼,而不需要修改的
最終用戶代碼,就像這樣。如前面所說,如果你想要寫一個好的twisted服務器,而不是僅僅的20行,那么你需要使用 the Application object.

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91九色网| 最新av在线播放 | 国产成人精品网站 | 一级成人在线 | 亚洲国产高清自拍 | www.91sp| 国产精品啪一品二区三区粉嫩 | 97超级碰碰人国产在线观看 | 国产精品久久久久免费视频 | 亚洲影院一区 | 中文字幕在线观看视频一区 | 免费视频www在线观看 | 色综合久久久久久久久久久 | 国产一区免费在线 | 七首小情歌泰剧在线播放 | 国产91丝袜在线播放0 | 中国av免费在线观看 | 一级网站 | 蜜桃91麻豆 | 美女久久久久 | 成人不卡一区二区 | 日韩a毛片免费观看 | 欧美aaaaa一级毛片在线 | 天天色宗合 | 99ri在线| 一级黄色电影网站 | 免费看综艺策驰影院 | 涩涩伊人 | 久夜草| 欧美成人一级 | 九九热精品视频在线 | 亚洲视屏在线 | 国产成人综合在线视频 | 久久思思爱 | 成人精品免费看 | 污片在线观看视频 | 精品一区二区三区免费视频 | av在线免费不卡 | 欧美成人久久 | 欧美一级毛片欧美一级成人毛片 | 九九久久视频 |