我不能为我的生活弄清楚如何使用Java中的两个按钮开始为游戏Minecraft启动服务器。
到目前为止,我有这个烂摊子。
try
{
ProcessBuilder processBuilder = new ProcessBuilder("/Users/UserName/Desktop/servers/test/launch.sh");
Process server;
if (event.getSource() == start_Btn)
{
server = processBuilder.start();
//OutputStream out = server.getOutputStream();
start_Btn.setText("Started");
}
else if (event.getSource() == stop_Btn)
{
OutputStream out = server.getOutputStream();
server.getOutputStream().write(new String("stop").getBytes("utf-8"));
stop_Btn.setText("Stoped");
start_Btn.setText("Start");
}
}
catch (IOException exception)
{
}
catch (InterruptedException exception)
{
}
我今天整天都在网上搜索,我决定最终把它带给你们。
我希望能够通过按下“开始”按钮来启动服务器,然后使用“停止”按钮停止它我已经设置了GUI并且我知道如何设置按钮事件。我可以轻松地让服务器从启动按钮开始,它只是我似乎无法管理的停止功能。
注意:要停止服务器,必须在启动服务器的命令行中输入“stop”。
非常感谢你的帮助,我非常感谢。
答案 0 :(得分:1)
好像从来没有一个答案解决了我的问题,看到我自己想出来的时候,我想我会把这个问题发给其他所有人。
我使用几个类来实现这个目标,准确地说是两个。一个是服务器的线程,另一个是向服务器发送命令。
首先,首先是启动和存放服务器流的代码。
这里的第一堂课是魔术发生的地方
public class Sender{
ConsoleWriter cWriter = new ConsoleWriter();
public void execute(){
this.ui = ui;
try{
ProcessBuilder pb = new ProcessBuilder(path_to_server+"launch.bat");
Process process = pb.start();
StreamGobbler sgError = new StreamGobbler(process.getErrorStream());
new Thread( sgError ).start();
writer = new PrintWriter( process.getOutputStream() );
} catch ( IOException e ){
e.printStackTrace();
}
}
private class StreamGobbler implements Runnable
{
private InputStream is;
public StreamGobbler( InputStream is ){
this.is = is;
}
@Override
public void run() {
try {
InputStreamReader isr = new InputStreamReader( is );
BufferedReader br = new BufferedReader( isr );
String line = null;
while ( ( line = br.readLine() ) != null ){
cWriter.writer(line, ui);
}
} catch ( IOException e ){
e.printStackTrace();
}
}
}
}
你问这是怎么回事?让我们从顶部开始。
这是我编写的用于将Minecraft的服务器控制台中的流写入我自己的GUI的类,这个代码并不重要,所以我会把它留下来。你可以写那个部分。
此方法使用Java的ProcessBuilder为服务器构建流程,然后启动流程。更重要的是,我们有StreamGobbler ..这使我们可以访问和“吞噬”来自服务器的输入流。基本上它从服务器接收控制台的所有输出。出于某种原因,不确定为什么,Minecraft服务器喜欢ErrorStream,所以我将它绑定到了它。然后我为gobbler创建了一个新的Thread,就是这样。这种方法的最后一件事是......
这将作为输出绑定到服务器,让我将命令发送到服务器,就像停止它或任何其他可用的服务器命令一样。
现在,在Gobbler上自我。这里不太多。基本上只是将我们从execute方法发送的inputStream发送给读者,然后缓冲它,最后将其读取到我的控制台编写器。
第二节很简单!
public class WriteCommand
{
public void send(String command)
{
txtA.append("Command:>>"+ command + "\n");
writer.write(command);
writer.write("\n");
writer.flush();
}
}
所有这一切都是写命令并点击'enter'然后将其刷新以准备发送下一个! txtA.append用于添加发送到我自己的控制台输出的命令,只是一个可视项目。
你去吧!希望这会帮助其他人。 如果你想看到这个代码在运行中,你可以看到它作为我用过它的应用程序的一部分。
答案 1 :(得分:0)
我今天正在从事同样的工作。我是java的新手,但我想我找到了你可能缺少的东西。
我或多或少跟随你的领先,但是在stop命令中使用斜杠"/stop"
似乎我需要关闭输出流才能完成操作。
private void stopButtonActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
try {
oS.write(new String("/stop").getBytes("utf-8"));
oS.close();
} catch (IOException e) {
e.printStackTrace();
}
}
我希望这会对你有所帮助。