2012-10-06 80 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