从.jar文件中捕获非标准输出

时间:2013-04-06 13:46:59

标签: c# java user-interface jar minecraft

我正在尝试制作一个用于在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();

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

当玩家加入像这样的消息时,{1}会被输出。我知道我可以分割这个字符串并获得播放器名称,但我认为它不是很好,因为有人可能会在聊天中说出类似的内容,而我的程序可能会将其解释为有人加入服务器。

我看到其他程序执行此操作(“BukkitGUI”),但我不确定如何执行此操作。 .jar文件输出播放器列表吗?我应该在源代码中查找它以查看输出内容?

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

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

player < playername > has joined the server

有什么办法可以打电话给这堂课吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我找到了解决方法。实际上很容易。

首先,我创建一个启动.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