【问题标题】:Catch non-standard output from .jar file从 .jar 文件中捕获非标准输出
【发布时间】:2013-04-06 13:46:58
【问题描述】:

我正在尝试制作一个用于在 C# 中托管 Minecraft CraftBukkit 服务器的 GUI。 CraftBukkit 服务器使用 .jar 托管,可以在此处找到源代码:https://github.com/Bukkit/CraftBukkit/

到目前为止,我能够从它接收输出并像这样给它输入:

var serverProcInfo = new ProcessStartInfo("javaw",
                                                  "-jar -Xms" + Ram + "M -Xmx" + Ram + "M \"" +
                                                  JarFileLocation + "\" -nojline " + AdditionalParams)
            {
                RedirectStandardInput = true,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                UseShellExecute = false
            };

        serverProc = new Process {StartInfo = serverProcInfo };

        serverProc.OutputDataReceived += ServerOutputDataReceived;
        serverProc.ErrorDataReceived += ServerOutputDataReceived;

        serverProc.BeginOutputReadLine();
        serverProc.BeginErrorReadLine();
        serverProc.WaitForExit();

我想创建一个当前在线玩家的列表。

当玩家加入时,会输出这样的消息player < playername > has joined the server。我知道我可以拆分这个字符串并获取玩家姓名,但我认为这不是很好,因为有人可能会在聊天中说类似的话,而我的程序可以将其解释为好像有人加入了服务器。

我看到其他程序这样做(“BukkitGUI”),但我不知道我该怎么做。 .jar文件是否输出播放器列表?我应该在它的源代码中寻找什么来查看它的输出?

我对 C# 比较陌生,从未学习过 Java。任何帮助将不胜感激。

EDIT1: 我发现 CraftBukkit.jar 有一个这样的类:

@SuppressWarnings("unchecked")
public Player[] getOnlinePlayers() {
    List<EntityPlayer> online = playerList.players;
    Player[] players = new Player[online.size()];

    for (int i = 0; i < players.length; i++) {
        players[i] = online.get(i).playerConnection.getPlayer();
    }
    return players;
}

有什么方法可以调用这个类吗?

【问题讨论】:

    标签: c# java user-interface jar minecraft


    【解决方案1】:

    不幸的是,java 和 C# 之间的跨进程通信并不是那么简单。您最好的选择是将列表命令发送到服务器并解析输出,或者如果您愿意编写一些 Java,您可以为我的世界服务器创建一个插件,打开一个套接字并来回发送信息。

    【讨论】:

    • 是的,很遗憾这是唯一的方法,但感谢您的回答。
    【解决方案2】:

    我找到了解决方案。其实很简单。

    首先,我创建一个将启动 .jar 文件的进程。然后我执行以下操作:

    Process.OutputDataReceived += ServerOutputHandler.ServerOutputReceived;
    Process.ErrorDataReceived += ServerOutputHandler.ServerOutputReceived;
    

    在我开始这个过程之后(Process.Start):

    Process.BeginOutputReadLine();
    Process.BeginErrorReadLine();
    

    如果您想了解有关处理 .jar 文件的更多信息,请随时查看我的开源项目(我不久前放弃了)ServerCrafter。对于我上面提到的代码的源代码部分,请看这里:Server Crafter source code: ServerCrafter\ServerCrafter.ClassLibrary\ClassLibrary\Server\Server.cs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 2015-03-15
      • 2021-05-21
      • 2013-08-07
      相关资源
      最近更新 更多