1

我正在使用 Twisted Python 服务器包装 Minecraft 服务器应用程序,该服务器具有 RESTful API 用于获取当前连接的玩家列表。Twisted 应用程序通过reactor.spawnProcess()启动 minecraft 服务器,然后通过ProcessTransport进行通信,后者写入标准输入。读取标准输出和标准输入由单独的protocol.ProcessProtocol类处理。

鉴于我想获得一个非常具体的命令的结果('list' 命令,它返回如下内容:

[INFO] Connected players: blah, blah2

如果我能够在标准输出中挑选出玩家列表行,那么将其传递到要求连接玩家列表的 RESTful API 视图的最佳方式是什么?请记住,我的标准输出阅读器无法直接与试图获取已连接玩家列表的函数进行通信。我可以解析标准输出并识别要交付的播放器列表,我只是不确定如何将其交付到将连接的播放器列表发送到客户端的 Web API 视图,因为视图和标准输出读取器不是直接的接触。

我有一些可能的方法来处理这个问题,但如果有人有想法,我宁愿以“正确的方式”做这件事。

4

1 回答 1

3

首先,永远不要打电话writeSomeData。打电话write。其次,拥有一个全局协议实例可能是个坏主意,出于所有常见原因,全局变量通常是个坏主意。

第三,在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它并取回 a Deferred,该代码将在不久之后触发已连接的玩家信息。

于 2011-05-24T12:15:56.667 回答