1

現在接続されているプレイヤーのリストを取得するための RESTful API を持つ Twisted Python サーバーで Minecraft サーバー アプリケーションをラップする作業を行っています。Twisted アプリは、reactor.spawnProcess()を介して minecraft サーバーを起動し、標準入力に書き込むProcessTransportを介して通信します。stdout と stdin の読み取りは、別のprotocol.ProcessProtocolクラスによって処理されます。

非常に具体的なコマンド (「list」コマンド、次のような結果を返す) の結果を取得したい場合:

[INFO] Connected players: blah, blah2

stdout でプレーヤー リストの行を選択できる場合、接続されているプレーヤーのリストを要求している RESTful API ビューにこれを配信する最良の方法は何ですか? 私のstdout リーダーは、接続されているプレーヤーのリストを取得しようとしている関数と直接通信できないことに注意してください。ビューと stdout リーダーが直接接続されていないため、stdout を解析して、配信するプレーヤー リストを特定できます。接続されたプレーヤー リストをクライアントに送信する Web API ビューにそれを配信する方法がわかりません。コンタクト。

これを処理するためのハックな方法がいくつかありますが、誰かがアイデアを持っている場合は、これを「正しい方法」で行うことをお勧めします。

4

1 に答える 1

3

まず、決して電話しないでくださいwriteSomeData。を呼び出しwriteます。第二に、グローバルプロトコルインスタンスを持つことはおそらく悪い考えです。すべての通常の理由から、グローバルは一般的に悪い考えです。

3番目に、必要な情報を取得するためのメソッドをサブクラスに追加しProcessProtocolます。プロトコルの仕事は、「プレーヤーのリストを要求する」などの抽象的なアクションを送信するバイトシーケンスに変換する方法と、受信したバイトシーケンスを「プロセスがこれらのプレーヤーが接続されていることを教えてくれた」などの抽象的なアクションに戻す方法を知ることです。

class NotchianProcessProtocol(protocol.ProcessProtocol):
    ...
    def listPlayers(self):
        self.transport.write("list")
        self._waiting.append(Deferred())
        return self._waiting[-1]

    def outReceived(self, bytes):
        outbuffer = self.outbuffer + bytes
        lines, leftover = parseLines(outbuffer)
        self.outbuffer = leftover

        for line in lines:
            if line.startswith('[INFO] Connected players: '):
                self._waiting.pop(0).callback(line)

これで、接続されたものへの参照を持つコードはどれでもそれをNotchianProcessProtocol呼び出して、すぐに接続されたプレーヤー情報で起動するコードをlistPlayers取り戻すことができます。Deferred

于 2011-05-24T12:15:56.667 に答える