如何检测用户是否已输入任何数据作为控制台输入

时间:2013-02-14 21:16:47

标签: python python-2.7 twisted user-input

有没有办法确定用户是否在终端窗口中输入了任何数据而无需使用阻止stdin

我正在使用twisted python实现聊天客户端,客户端代码应显示来自其他连接客户端的消息。一旦客户端输入消息并点击进入,我希望它运行一个事件驱动的循环,它将消息发送到服务器,然后服务器将其广播给每个其他客户端。

简而言之,我正在尝试寻找一种方法来检测用户何时点击ENTER或在终端中输入一些文本而不必阻止该程序。

更新:到目前为止的客户端代码..

class MyClientProtocol( protocol.Protocol ):
    def sendData( self ):
            message = raw_input( 'Enter Message: ' )
            if message and ( message != "quit()" ):
                logging.debug( " ...Sending %s ...", message )
                self.transport.write( str( message ) )
            else:
                self.transport.loseConnection()

    def connectionMade( self ):
        print "Connection made to server!"

    def dataReceived( self, msg ):
        print msg
        self.sendData()

class MyClientFactory( protocol.ClientFactory ):
    protocol = MyClientProtocol
    clientConnectionLost = clientConnectionFailed = lambda self, connector, reason: reactor.stop()

reactor.connectTCP( HOST, PORT, MyClientFactory() )
reactor.run()

此代码目前仅在从服务器接收回来后接受用户输入,因为我在sendData中呼叫dataReceived。关于如何让这个用户输入数据,以及从服务器获取数据的任何建议?

2 个答案:

答案 0 :(得分:3)

如果您已经在使用Twisted,他们会使用插件将任何连接到事件循环中。

但是对于stdin,你甚至不需要插件;它是内置的。其中一个库存示例甚至可以准确显示您正在尝试做什么。它是名为stdin.py的那个。

答案 1 :(得分:0)

我最近还玩过这个。我所做的只是启动一个单独的线程(使用threading模块)等待用户输入,主线程正在接收和打印广播消息,如:

def collect_input():
   while True:
      msg = raw_input()
      handle(msg) # you'll need to implement this

# in client code
import threading
t = threading.Thread(target=collect_input)
t.start()

我不确定这是不是一个好主意,但它是第一个出现在我脑海中的东西,似乎有效。

注意:我没有使用Twisted,仅使用sockets。从the other answer可以看出,您不需要使用Twisted实现它。