国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python下的twisted框架入門指引

2020-02-23 00:44:00
字體:
供稿:網(wǎng)友

什么是twisted?

twisted是一個用python語言寫的事件驅(qū)動的網(wǎng)絡(luò)框架,他支持很多種協(xié)議,包括UDP,TCP,TLS和其他應(yīng)用層協(xié)議,比如HTTP,SMTP,NNTM,IRC,XMPP/Jabber。 非常好的一點是twisted實現(xiàn)和很多應(yīng)用層的協(xié)議,開發(fā)人員可以直接只用這些協(xié)議的實現(xiàn)。其實要修改Twisted的SSH服務(wù)器端實現(xiàn)非常簡單。很多時候,開發(fā)人員需要實現(xiàn)protocol類。

一個Twisted程序由reactor發(fā)起的主循環(huán)和一些回調(diào)函數(shù)組成。當(dāng)事件發(fā)生了,比如一個client連接到了server,這時候服務(wù)器端的事件會被觸發(fā)執(zhí)行。
用Twisted寫一個簡單的TCP服務(wù)器

下面的代碼是一個TCPServer,這個server記錄客戶端發(fā)來的數(shù)據(jù)信息。

==== code1.py ====import sysfrom twisted.internet.protocol import ServerFactoryfrom twisted.protocols.basic import LineReceiverfrom twisted.python import logfrom twisted.internet import reactorclass CmdProtocol(LineReceiver):  delimiter = '/n'  def connectionMade(self):    self.client_ip = self.transport.getPeer()[1]    log.msg("Client connection from %s" % self.client_ip)    if len(self.factory.clients) >= self.factory.clients_max:      log.msg("Too many connections. bye !")      self.client_ip = None      self.transport.loseConnection()    else:      self.factory.clients.append(self.client_ip)  def connectionLost(self, reason):    log.msg('Lost client connection. Reason: %s' % reason)    if self.client_ip:      self.factory.clients.remove(self.client_ip)  def lineReceived(self, line):    log.msg('Cmd received from %s : %s' % (self.client_ip, line))class MyFactory(ServerFactory):  protocol = CmdProtocol  def __init__(self, clients_max=10):    self.clients_max = clients_max    self.clients = []log.startLogging(sys.stdout)reactor.listenTCP(9999, MyFactory(2))reactor.run()

下面的代碼至關(guān)重要:

from twisted.internet import reactorreactor.run()

這兩行代碼會啟動reator的主循環(huán)。

在上面的代碼中我們創(chuàng)建了"ServerFactory"類,這個工廠類負(fù)責(zé)返回“CmdProtocol”的實例。 每一個連接都由實例化的“CmdProtocol”實例來做處理。 Twisted的reactor會在TCP連接上后自動創(chuàng)建CmdProtocol的實例。如你所見,protocol類的方法都對應(yīng)著一種事件處理。

當(dāng)client連上server之后會觸發(fā)“connectionMade"方法,在這個方法中你可以做一些鑒權(quán)之類的操作,也可以限制客戶端的連接總數(shù)。每一個protocol的實例都有一個工廠的引用,使用self.factory可以訪問所在的工廠實例。

上面實現(xiàn)的”CmdProtocol“是twisted.protocols.basic.LineReceiver的子類,LineReceiver類會將客戶端發(fā)送的數(shù)據(jù)按照換行符分隔,每到一個換行符都會觸發(fā)lineReceived方法。稍后我們可以增強(qiáng)LineReceived來解析命令。

Twisted實現(xiàn)了自己的日志系統(tǒng),這里我們配置將日志輸出到stdout

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 陵水| 罗江县| 南投市| 乐东| 区。| 建阳市| 邢台市| 长宁区| 来安县| 泗水县| 陆丰市| 犍为县| 前郭尔| 正定县| 仲巴县| 象州县| 邓州市| 崇阳县| 扎赉特旗| 肇州县| 鄂伦春自治旗| 石泉县| 灵宝市| 驻马店市| 张北县| 宣武区| 西乌珠穆沁旗| 巴马| 略阳县| 定西市| 景洪市| 金昌市| 古田县| 和政县| 五大连池市| 屯留县| 梁山县| 蒙阴县| 辽源市| 治县。| 瓦房店市|