2

ブロッキングを使用せずに、ユーザーが端末ウィンドウにデータを入力したかどうかを確認する方法はありますかstdin

ツイスト python を使用してチャット クライアントを実装しています。クライアント コードは、接続されている他のクライアントからのメッセージを表示する必要があります。クライアントがメッセージを入力してEnterキーを押すとすぐに、イベント駆動型ループを実行して、メッセージをサーバーに送信し、それを他のすべてのクライアントにブロードキャストします。

つまり、プログラムをブロックすることなく、ユーザーが 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。これでユーザーが入力したデータを取得し、さらにサーバーからデータを取得し続ける方法について何か提案はありますか?

4

2 に答える 2

3

すでにTwistedを使用している場合は、ほとんどすべてのものをイベントループにフックするためのプラグインがあります。

しかしstdin、の場合、プラグインも必要ありません。組み込みです。ストックの例の1つは、あなたがやろうとしていることを正確に示しています。それはという名前のもの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()

それが良いアイデアかどうかはわかりませんが、最初に頭に浮かんだことで、うまくいったようです。

注: を使用していませんでしTwistedsockets他の回答からわかるように、Twisted で実装する必要はありません。

于 2013-02-14T21:21:53.180 に答える