首頁  >  文章  >  後端開發  >  python 程式設計之twisted詳解及簡單實例

python 程式設計之twisted詳解及簡單實例

高洛峰
高洛峰原創
2017-02-03 16:12:421743瀏覽

python 程式設計之twisted詳解

前言:

 我不擅長寫socket程式碼。一是用c寫起來比較麻煩,二是自己平常也沒有這方面的需求。等到自己真正想了解的時候,才發現自己在這方面確實有需要改進的地方。最近因為專案的原因需要寫一些Python程式碼,才發現在python下面開發socket是一件多麼爽的事情。

    對大多數socket來說,使用者其實只要專注在三個事件就可以了。這分別是建立、刪除、和收發資料。 python中的twisted函式庫正好可以幫助我們完成這麼一個目標,實用起來也不麻煩。下面的程式碼來自twistedmatrix網站,我覺得還蠻不錯的,貼在這裡跟大家分享一下。如果需要測試的話,直接telnet localhost 8123就可以了。如果需要在twisted中處理訊號,可以先註冊signal函數,在signal函數中呼叫reactor.stop(),後面twisted繼續call stop_factory,這樣就可以繼續完成剩下的清理工作了。

from twisted.internet.protocol import Factory 
from twisted.protocols.basic import LineReceiver 
from twisted.internet import reactor 
  
class Chat(LineReceiver): 
  
  def __init__(self, users): 
    self.users = users 
    self.name = None
    self.state = "GETNAME"
  
  def connectionMade(self): 
    self.sendLine("What's your name?") 
  
  def connectionLost(self, reason): 
    if self.name in self.users: 
      del self.users[self.name] 
  
  def lineReceived(self, line): 
    if self.state == "GETNAME": 
      self.handle_GETNAME(line) 
    else: 
      self.handle_CHAT(line) 
  
  def handle_GETNAME(self, name): 
    if name in self.users: 
      self.sendLine("Name taken, please choose another.") 
      return
    self.sendLine("Welcome, %s!" % (name,)) 
    self.name = name 
    self.users[name] = self
    self.state = "CHAT"
  
  def handle_CHAT(self, message): 
    message = "<%s> %s" % (self.name, message) 
    for name, protocol in self.users.iteritems(): 
      if protocol != self: 
        protocol.sendLine(message) 
  
  
class ChatFactory(Factory): 
  
  def __init__(self): 
    self.users = {} # maps user names to Chat instances 
  
  def buildProtocol(self, addr): 
    return Chat(self.users) 
  
  def startFactory(self): 
    print &#39;start&#39;
  
  def stopFactory(self): 
    print &#39;stop&#39;
  
reactor.listenTCP(8123, ChatFactory()) 
reactor.run()

感謝閱讀,希望能幫助大家,謝謝大家對本站的支持!

更多python 程式設計之twisted詳解及簡單實例相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn