python twsited快速基礎

協議處理類通常會子類化twisted.com .internet.protocol. protocol。大多數協議處理程序從這個類繼承,或者從它的一個方便子類繼承。協議類的實例按連接實例化,按需實例化,並在連接完成時消失。這意味着持久化配置不會保存在協議中。

持久化配置保存在工廠類中,工廠類通常繼承自twisted.com .internet.protocol.Factory。工廠的buildProtocol方法用於爲每個新連接創建Protocol。

能夠在多個端口或網絡地址上提供相同的服務通常很有用。這就是爲什麼工廠不監聽連接,實際上不知道任何關於網絡的信息。

Twisted協議以異步方式處理數據。當事件從網絡到達時,協議protocol響應它們,而事件到達將調用協議上的方法。

這是最簡單的協議之一。它只是簡單地回寫所寫的內容,而不響應所有事件。

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

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

下面是一個協議響應另一個事件的例子:

from twisted.internet.protocol import Protocol 
class QOTD(Protocol):
    def connectionMade(self):
        self.transport.write("一天一蘋果,不用請醫生\r\n") 
        self.transport.loseConnection()

這個協議用一個名言響應初始連接,然後終止連接。
connectionMade事件通常相應連接對象啓動發生,以及任何初始的問候語(如上面的QOTD協議)。connectionLost事件應用於任何特定於連接的對象消失。下面是一個例子:

from twisted.internet.protocol import Protocol
class Echo(Protocol):
    def __init__(self, factory):
        self.factory = factory
def connectionMade(self):
    self.factory.numProtocols = self.factory.numProtocols + 1
    self.transport.write("歡迎,這是第%d個運行中的連接\n" % (self.factory.numProtocols,))
def connectionLost(self, reason):
    self.factory.numProtocols = self.factory.numProtocols - 1
def dataReceived(self, data): 
    self.transport.write(data)

工廠用於共享存在於超過任何給定連接的生命週期的狀態。

在Echo協議代碼中,loseConnection是在寫入傳輸之後立即調用的。只有當Twisted將所有數據寫完入操作系統時,loseConnection調用纔會關閉連接,因此在這種情況下使用它是安全的,無需擔心傳輸寫入丟失。如果生產者與傳輸一起使用,loseConnection只會在生產者解除註冊時關閉連接。在某些情況下,等待所有數據被寫出來並不是我們想要的。由於網絡故障、bug或另一端連接者的惡意,寫入到傳輸端的數據可能無法交付,因此即使調用loseConnection,連接也不會丟失。在這些情況下,可以使用abortConnection:它立即關閉連接,而不管傳輸中仍然未寫入的緩衝數據或仍然有註冊的生產者。

在本例中,我創建了一個協議工廠。我想告訴這個工廠它的任務是構建QOTD協議實例,所以我設置了它的buildProtocol方法來返回QOTD類的實例。然後,我想在一個TCP端口上偵聽,因此我創建了一個TCP4ServerEndpoint來標識我想綁定到的端口,然後將我剛剛創建的工廠傳遞到它的偵聽方法。
listen()告訴反應器使用特定的協議來處理到端點地址的連接,但是反應器需要運行才能執行任何操作。run()啓動反應器,然後永遠等待連接到達指定的端口。您可以通過在終端中按Control-C或調用reactor.stop()來停止反應器。

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Sun Sep 16 15:27:20 2018

@author: myhaspl
@email:[email protected]
server
"""
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint 
from twisted.internet import reactor
from twisted.internet.protocol import Protocol 

class QOTD(Protocol):#協議類
    def connectionMade(self):
        self.transport.write("您好!歡迎您的登錄,再見!\r\n") 
        self.transport.loseConnection()

class QOTDFactory(Factory):
    def buildProtocol(self, addr):
        return QOTD()

endpoint = TCP4ServerEndpoint(reactor, 21200)
endpoint.listen(QOTDFactory())
reactor.run()
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Sun Sep 16 15:27:20 2018

@author: myhaspl
@email:[email protected]
server
"""
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint 
from twisted.internet import reactor
from twisted.internet.protocol import Protocol 

class QOTD(Protocol):#協議類
    def connectionMade(self):
        self.transport.write("您好!歡迎您的登錄,再見!\r\n") 
        self.transport.loseConnection()

class QOTDFactory(Factory):
    def buildProtocol(self, addr):
        return QOTD()

if __name__=="__main__":
    endpoint = TCP4ServerEndpoint(reactor, 21210)
    endpoint.listen(QOTDFactory())
    reactor.run()
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Sun Sep 16 15:28:44 2018

@author: myhaspl
@email:[email protected]
client
"""

from twisted.internet.protocol import Protocol
from twisted.internet.protocol import ClientFactory
from twisted.internet import reactor

HOST="localhost"
PORT=21210
class ClientMessage(Protocol):#協議類
  def connectionMade(self):
    data=raw_input("請輸入要發送給服務器的消息")
    self.transport.write(data)
  def dataReceived(self, data):
    print data       
    self.transport.loseConnection()

class ClientMessageFactory(ClientFactory):#工廠類
  def startedConnecting(self, connector):
    print '開始連接'

  def buildProtocol(self, addr):
    print '已經連接.'
    return ClientMessage()

  def clientConnectionLost(self, connector, reason):
    print '%s==>連接丟失!'%reason

  def clientConnectionFailed(self, connector, reason):
    print '%s==>連接錯誤!'%reason

if __name__=="__main__":
    reactor.connectTCP(HOST, PORT, ClientMessageFactory())
    reactor.run()

客戶端

開始連接
已經連接.
請輸入要發送給服務器的消息hi
您好!歡迎您的登錄,再見!

[Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionDone'>: Connection was closed cleanly.
]==>連接丟失!


#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Sun Sep 16 15:27:20 2018

@author: myhaspl
@email:[email protected]
server
"""
from twisted.internet.protocol import Factory
from twisted.internet.endpoints import TCP4ServerEndpoint 
from twisted.internet import reactor
from twisted.internet.protocol import Protocol 
import time

class QOTD(Protocol):#協議類
    def connectionMade(self):
        print "接受連接"
        self.transport.write("您好!歡迎您的登錄,再見!\r\n") 
    def dataReceived(self, data):
        if data:
            print "客戶端發來消息:%s"%data 
            self.transport.write("[%s]:%s"%(time.ctime(),data))
        self.transport.loseConnection()
class QOTDFactory(Factory):
    def buildProtocol(self, addr):
        return QOTD()

if __name__=="__main__":
    endpoint = TCP4ServerEndpoint(reactor, 21210)
    endpoint.listen(QOTDFactory())
    reactor.run()

接受連接
客戶端發來消息:hello,1


#!/usr/bin/env python2
# -*- coding: utf-8 -*-

"""
Created on Sun Sep 16 15:28:44 2018

@author: myhaspl
@email:[email protected]
client
"""

from twisted.internet.protocol import Protocol
from twisted.internet.protocol import ClientFactory
from twisted.internet import reactor

HOST="localhost"
PORT=21210
class ClientMessage(Protocol):#協議類
  def connectionMade(self):
    data=raw_input("請輸入消息:")
    self.transport.write(data)
  def dataReceived(self, data):
    print "服務器迴應:%s"%data       

class ClientMessageFactory(ClientFactory):#工廠類
  def startedConnecting(self, connector):
    print '開始連接'

  def buildProtocol(self, addr):
    print '已經連接.'
    return ClientMessage()

  def clientConnectionLost(self, connector, reason):
    print '%s==>連接丟失!'%reason

  def clientConnectionFailed(self, connector, reason):
    print '%s==>連接錯誤!'%reason

if __name__=="__main__":
    reactor.connectTCP(HOST, PORT, ClientMessageFactory())
    reactor.run()

開始連接
已經連接.
請輸入消息:hello,1
服務器迴應:您好!歡迎您的登錄,再見!

服務器迴應:[Sun Sep 16 16:37:08 2018]:hello,1
[Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionDone'>: Connection was closed cleanly.
]==>連接丟失!

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