基於事件驅動Socket

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from twisted.internet import protocol
from twisted.internet import reactor

class Echo(protocol.Protocol):
def dataReceived(self, data):
self.transport.write(data)

def main():
factory = protocol.ServerFactory()
factory.protocol = Echo

reactor.listenTCP(8000,factory)
reactor.run()

if __name__ == __main__:
main()

程序執行流程:

  • 運行服務端程序
  • 創建Protocol的派生類Echo
  • 創建ServerFactory對象,並將Echo類封裝到其protocol欄位中
  • 執行reactor的 listenTCP 方法,內部使用 tcp.Port 創建socket server對象,並將該對象添加到了 reactor的set類型的欄位 _read 中
  • 執行reactor的 run 方法,內部執行 while 循環,並通過 select 來監視 _read 中文件描述符是否有變化,循環中...
  • 客戶端請求到達
  • 執行reactor的 _doReadOrWrite 方法,其內部通過反射調用 tcp.Port 類的 doRead 方法,內部 accept 客戶端連接並創建Server對象實例(用於封裝客戶端socket信息)和 創建 Echo 對象實例(用於處理請求) ,然後調用 Echo 對象實例的 makeConnection 方法,創建連接。
  • 執行 tcp.Server 類的 doRead 方法,讀取數據,
  • 執行 tcp.Server 類的 _dataReceived 方法,如果讀取數據內容為空(關閉鏈接),否則,出發 Echo 的 dataReceived 方法
  • 執行 Echo 的 dataReceived 方法

從源碼可以看出,上述實例本質上使用了事件驅動的方法 和 IO多路復用的機制來進行Socket的處理。

非同步IO操作

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from twisted.internet import reactor, protocol
from twisted.web.client import getPage
from twisted.internet import reactor
import time

class Echo(protocol.Protocol):

def dataReceived(self, data):
deferred1 = getPage(http://cnblogs.com)
deferred1.addCallback(self.printContents)

deferred2 = getPage(http://baidu.com)
deferred2.addCallback(self.printContents)

for i in range(2):
time.sleep(1)
print execute ,i

def execute(self,data):
self.transport.write(data)

def printContents(self,content):
print len(content),content[0:100],time.time()

def main():
factory = protocol.ServerFactory()
factory.protocol = Echo

reactor.listenTCP(8000,factory)
reactor.run()

if __name__ == __main__:
main()

原文網址:cnblogs.com/wupeiqi/art

參考網址:twistedmatrix.com/trac

twistedmatrix.com/docum


推薦閱讀:
查看原文 >>
相关文章