協議處理類通常會子類化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.
]==>連接丟失!