Twisted 介绍 及TCP广播系统实例
twisted 提供更多傳輸層 udp,tcp,tls及應(yīng)用層HTTP,FTP等協(xié)議的支持,在開(kāi)發(fā)方法上更提供了豐富的特性來(lái)支持異步編程
安裝twisted
建議使用anaconda 安裝,conda install twisted,
Windows 安裝需要先安裝兩個(gè)支持庫(kù),zope inteeface和pywin32 然后pip?install twisted,
Linux系統(tǒng) 直接命令行 apt-get install python-twisted 或者yum install?python-twisted?
實(shí)戰(zhàn)演練 - 開(kāi)發(fā)TCP廣播系統(tǒng)
系統(tǒng)描述:廣播系統(tǒng)接收任意客戶端的鏈接請(qǐng)求,并將任意客戶端發(fā)送給服務(wù)器的消息轉(zhuǎn)發(fā)給所有其他客戶端,本系統(tǒng)是一個(gè)基本的實(shí)時(shí)通信模型
1、廣播服務(wù)器
?twisted基于傳輸層TCP編程時(shí),直接針對(duì)Twisted的Protocol,Factory等類進(jìn)行編程,而無(wú)需操作socket里面的bind,send,receive等基本用語(yǔ),并且定義他們的子類并重寫(xiě)connectionMode,dataReceived進(jìn)行事件化的TCP變成風(fēng)格
- connectionMode() 當(dāng)鏈接建立時(shí)由twisted框架調(diào)用,本函數(shù)主要作用是在系統(tǒng)中注冊(cè)該鏈接,方便調(diào)用
- dataReceived() 當(dāng)收到客戶端數(shù)據(jù)時(shí)由twisted框架調(diào)用
- connectionLost()當(dāng)鏈接斷開(kāi)時(shí)由框架調(diào)用,實(shí)際應(yīng)用中用來(lái)清理鏈接占用的資源?
本廣播系統(tǒng)的Protocol代碼為:
from twisted.internet.protocol import Protocolclients = [] # 保存所有客戶端連接class Spreader (Protocol): # 繼承Protocol,實(shí)現(xiàn)需要重載的方法def __init__(self, factory):self.factory = factorydef connectionMade(self): # 對(duì)連接的客戶端計(jì)數(shù),并保存到clients列表中self.factory.numProtocols = self.factory.numProtocols + 1self.transport.write (("歡迎來(lái)到Spread site,你是第%d 個(gè)客戶端用戶!\n" % (self.factory.numProtocols)).encode ('utf8'))print ("新連接: %d" % self.factory.numProtocols)clients.append (self)def connectionLost(self, reason): # 執(zhí)行反向操作self.factory.numProtocols = self.factory.numProtocols - 1clients.remove (self)print ("關(guān)閉連接:%d" % self.factory.numProtocols)def dataReceived(self, data): # 循環(huán)當(dāng)前clients列表中的所有客戶端,將受到的數(shù)據(jù),分發(fā)給自己之外的所有客戶端if data == 'close': # 如果受到客戶端發(fā)來(lái)的數(shù)據(jù)‘close’ ,則主動(dòng)關(guān)閉與該客戶端的鏈接 self.transport.lostConnection ()for client in clients:if client != self:client.transport.write (data)開(kāi)發(fā)Factory子類
Factory類起到了 對(duì)Protocol 類的管理作用,當(dāng)有新的客戶端鏈接時(shí),框架調(diào)用Factory.buildProtocol(),可以創(chuàng)建Protoco子類的實(shí)例,代碼如下
from twisted.internet.protocol import Factoryfrom twisted.internet.endpoints import TCP4ServerEndpoint from twisted.internet import reactorclass SpreaderFactory(Factory):def __init__(self):self.numProtocols = 0def buildProtocol(self, addr):return Spreader(self)# 8007是本服務(wù)器的監(jiān)聽(tīng)端口 endpoint = TCP4ServerEndpoint(reactor,8007) endpoint.listen(SpreaderFactory())reactor.run() # 掛起運(yùn)行2、廣播客戶端
實(shí)現(xiàn)與服務(wù)器程序相匹配的TCP客戶端程序
from twisted.internet.protocol import Protocol, ClientFactoryfrom twisted.internet import reactor import threading import fileinput import time import sys import datetimeclass Echo (Protocol): # Protocol子類,此處進(jìn)行通信邏輯開(kāi)發(fā)def __init__(self):self.connected = False # 在函數(shù)routine中使用該狀態(tài)決定是否向服務(wù)器發(fā)送消息def connectionMade(self):self.connected = Truedef connectionLost(self, reason):self.connected = Falsedef dataReceived(self, data):print (data.decode ('utf8'))class EchoClientFactory (ClientFactory): # Factory子類,管理鏈接關(guān)系def __init__(self):self.protocol = Nonedef startedConnecting(self, connector):print ("開(kāi)始鏈接")def buildProtocol(self, addr):print ('已連接')self.protocol = Echo ()return self.protocoldef clientConnectionLost(self, connector, reason):print ("鏈接丟失,原因是:", reason)def clientConnectionFailed(self, connector, reason):print ('鏈接失敗,原因是:', reason)bStop = Falsedef routine(factory): # 每隔5秒向服務(wù)器發(fā)送消息while not bStop:if factory.protocol and factory.protocol.connected:factory.protocol.transport.write(('hello,i am xx %s' % (datetime.datetime.now())).encode('utf8'))time.sleep(5)host = '127.0.0.1' port = 8007 factory = EchoClientFactory() reactor.connectTCP(host,port,factory) threading.Thread(target=routine,args=(factory,)).start() # 啟動(dòng)縣城運(yùn)行routine()函數(shù) reactor.run() # 掛起運(yùn)行 bStop = True # 通知routine線程退出?結(jié)果:
server:
?
客戶端:
?
轉(zhuǎn)載于:https://www.cnblogs.com/Erick-L/p/7084810.html
總結(jié)
以上是生活随笔為你收集整理的Twisted 介绍 及TCP广播系统实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux 下crontab简单使用
- 下一篇: imx6背光驱动调试