什么是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
新聞熱點
疑難解答
圖片精選