2012-10-06 149 views
1

試圖獲得一個簡單的python扭曲的客戶端 - 服務器應用程序工作。目的是用這個來控制一些IRC機器人;像一個主控制檯向所有(5個)機器人發出命令。python扭曲的簡單的客戶端 - 服務器通信

有一天,附加的代碼將形成服務器代碼。目前,我正在使用telnet來模擬連接到「派對線」的IRC殭屍工具(客戶端)。

我卡在的是,我怎麼從附加的服務器應用程序sendLine到所有的機器人?每次我創建一個循環來獲取raw_input時,我最終都會拖延執行。我想過對連接狀態函數進行測試,但似乎無法找到(如果連接是真的,raw_input類邏輯)。

from twisted.internet.protocol import Factory 
from twisted.protocols.basic import LineReceiver 
from twisted.internet import reactor 

class bottalk(LineReceiver): 

    botlist = [] 

    def lineReceived(self, line): 
     botlistspot = len(self.botlist) 
     self.botlist.append(line) 
     print self.botlist[botlistspot] + " checked in." 

class botfactory(Factory): 

    def buildProtocol(self, addr): 
     return bottalk() 

reactor.listenTCP(8123, botfactory()) 
reactor.run() 

我試過把下面的raw_input放在LineReceiver類的外面。遍及..我希望這個raw_input提示不斷地提示輸入,而不僅僅是像一個線接收到的事件 - 所有的時間..我想服務器機器人控制檯隨時準備接受我的輸入和sendLine所有的機器人。

sendLine(raw_input("> ")) 

回答

2

根本不使用raw_input。相反,實例化一個stdio.StandardIO,給它的構造函數一個LineReceiver子類的實例。您在子類中定義的lineReceived將在stdin上有新行可用時被調用,然後您可以將它廣播給機器人。

This example from the Twisted site表明了這個想法。

+0

你能解釋一下嗎?我對Python和OOP很陌生 - 可能是一個簡單的例子嗎?我不想讓這個問題得到解決,只是一個示範,如果它沒有太多的工作。謝謝! :) – user1675884

+0

答案中有一個例子。你能描述一下你想要的更多嗎? –

+0

這個問題表明你的問題是'raw_input'阻止了Twisted應用程序的執行。請查看[與答案中提供的示例的鏈接](http://twistedmatrix.com/documents/current/core/examples/stdiodemo.py)。這是一個簡單而直接的演示,演示如何在Twisted中執行非阻塞等價的'raw_input'。如果您的問題是關於其他問題,請隨時編輯並澄清! – user4815162342