twisted網絡框架

一、簡介

twisted是一個封裝好的網絡通信的庫,可以幫助我們快速進行網絡編程。注意,python3中,字符串必須轉碼成utf8的格式,否則無法發送。比如str(“test”).encode(“utf8”)即可

二、服務端

服務器需要進行如下操作:

1、在某個端口上一直監聽客戶端的請求
2、接收到客戶端請求後,向客戶端發出相應的迴應
主要分爲下面幾個步驟:

1、繼承protocol.Protocol建立有關的協議,並實現有關的回調函數
2、繼承protocol.Factory建立通信工廠,並在buildProtocol函數中實例化1中的協議
3、reactor.listenTCP(8000, QuoteFactory()) 在某個端口運行通信工廠

# -*- coding utf-8 -*-
from twisted.internet.protocol import Factory, connectionDone
from twisted.internet import reactor, protocol
class QuoteProtocol(protocol.Protocol):
    def __init__(self, factory):
        self.factory = factory
    def connectionMade(self):  # 建立連接後的回調函數
        self.factory.numConnections += 1
    def dataReceived(self, data):  # 接收到數據後的回調函數
        print("Number of active connections: %d"
              % self.factory.numConnections)
        print("Received:%s\n Sending: %s" % (data, self.getQuote()))
        self.transport.write(self.getQuote())
        self.updateQuote(data)
    def connectionLost(self, reason=connectionDone):  # 斷開連接後的反應
        self.factory.numConnections -= 1
    def getQuote(self):
        return self.factory.quote
    def updateQuote(self, quote):
        self.factory.quote = quote
class QuoteFactory(Factory):
    numConnections = 0
    def __init__(self, quote=None):  # 數據接收後放在在quote中
        self.quote = quote or str("Test").encode("utf8")
    def buildProtocol(self, addr):
        return QuoteProtocol(self)
reactor.listenTCP(8000, QuoteFactory())
reactor.run()
# service_identity

三、客戶端

客戶端的作用如下:

1、確定服務器的IP和對應的端口號。
2、向服務器發送有關的數據包
主要分爲以下幾個步驟:

1、繼承protocol.Protocol建立有關的協議,並實現有關的回調函數
2、繼承protocol.ClientFactory類,建立客戶端通信工廠
3、在通信工廠中實現buildProtocol的協議,並實現鏈接失敗的處理函數

# -*- coding utf-8 -*-
from twisted.internet import reactor, protocol
class QuoteProtocol(protocol.Protocol):
    def __init__(self, factory):
        self.factory = factory
    def connectionMade(self):
        self.sendQuote()
    def sendQuote(self):
        self.transport.write(self.factory.quote)
    def dataReceived(self, data):
        print("Received quote", data)
        self.transport.loseConnection()
class QuoteClientFactory(protocol.ClientFactory):
    def __init__(self, quote):  # quote是需要發送的數據
        self.quote = quote
    def buildProtocol(self, addr):
        return QuoteProtocol(self)
    def clientConnectionFailed(self, connector, reason):
        print("connection failed", reason.getErrorMessage())
        maybeStopReactor()
    def clientConnectionLost(self, connector, reason):
        print("connection lost", reason.getErrorMessage())
        maybeStopReactor()
def maybeStopReactor():
    global quote_counter
    quote_counter -= 1
    if not quote_counter:
        reactor.stop()
quotes = [
    str("You snooze you lose").encode(),
    str("The early brid gets worm").encode(),
    str("Carpe diem").encode()]
quote_counter = len(quotes)
for quote in quotes:
    reactor.connectTCP('localhost', 8000, QuoteClientFactory(quote))
reactor.run()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章