我正在尝试制作一个用于在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
有什么办法可以打电话给这堂课吗?
答案 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