2

有没有办法找出用户是否在终端窗口中输入了任何数据而不必使用阻塞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()

此代码目前仅在从服务器接收到某些内容后才接受用户输入,因为我正在调用sendDatadataReceived关于如何让这个拾取用户输入的数据以及继续从服务器获取数据的任何建议?

4

2 回答 2

3

如果你已经在使用 Twisted,他们有插件可以将几乎任何东西挂接到事件循环中。

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

于 2013-02-14T21:35:46.767 回答
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。正如您从另一个答案中看到的那样,您不需要使用 Twisted 来实现它。

于 2013-02-14T21:21:53.180 回答