game-server GUI erstellen

Chloroplast

Bekanntes Mitglied
ich habe vor eine GUI für ein game-server (Minecraft, kennt vielleicht jemand 🙂 ) zu erstellen. ich habe nur keine Ahnung wie ein applet, oder frame mit dem programm kommuniezieren soll. bitte um möglichst unkompliezierte Lösung. (hab bei google und co schon geguckt. entweder da gibts nichts, oder ich bin einfach zu blöd :rtfm🙂
 
Was genau meisnt du mit GUI ? Minecraft - Server hat ja bereits ne GUI, bzw ein Fenster wo Konsole drin und mit Speicherverbracuh etc...

Willste dann quasi eine GUI machen, mit Buttons und allem drum und dran ?
 
mit der Runtime Klasse kannst du Przesse starten, davon lesen und kommandos hinschicken. schau dir das mal an... ist aber nicht einfach...
 
Zuletzt bearbeitet:
Ich habe soetwas für Minecraft auch mal gemacht. Bin dabei den von ARadauer beschriebenen Weg gegangen: Einen Prozess aus meiner Java-Anwendung gestartet (sozusagen den Minecraft Serverstart gewrapt), per Inputstream Befehle gesendet und den Outputstream ausgewertet.

Ich wollte damals eine Chatfunktion per Website mit Minecraft entwickeln. Aufgefallen war mir, dass nicht alles auf dem Outputstream ankommt was ich haben wollte, sondern viel Output auch auf dem Errorstream landet (nur als Hinweis). Im Endeffekt habe ich die Entwicklung eingestellt, weil die Möglichkeiten nur über Konsole bezüglich Serversteuerung halt sehr begrenzt sind.

Was für dich interessant sein könnte ist Craftbukkit. Einfach mal googlen. Damit kannst du Plugins in Java für Minecraft schreiben.
 
Wenn du Befehle per InputStream gesendet hast, wundert es mich nicht, dass das ganze nicht funktioniert hat ;-).
 
Du musst dich als eigene Gegenstelle sehen. Input ist das was bei dir rein kommt, und output ist das was bei dir raus geht
Befehle output, input auswerten...

Ja, wenn man sich als gegenstelle sieht. Aber wenn man sich die Stream vom Process holt, dann bleibt der InputStream der Input in den man die Befehle schiebt und der OutputStream und ErrorStream sind die Ausgaben vom Process 😳
 
Zeig mir mal, wie du Befehle in einen InputStream schreibst. Und ein Konstrukt wie:
Java:
public class MyInputStream extends OutputStream {
zählt nicht ;-).
 
leute leute, ich habe da oben etwas durcheinander gebracht. befehle werden natürlich an den outputstream geschrieben. der errorstream ist ja auch ein inputstream...

für den thread-ersteller mal meine damaligen experimente. läuft auch mit dem aktuellen mc-server (1.7.3). vielleicht hilft das ja weiter:

Java:
package de.meijr.minecraftservletwrapper;

import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.net.InetSocketAddress;

public class Main {

    public static void main(final String[] args) {
        MinecraftWrapper wrapper = null;
        try {
            wrapper = new MinecraftWrapper();
            final HttpServer server = HttpServer.create(
                    new InetSocketAddress(8080), 10);
            server.createContext("/info", wrapper);
            server.setExecutor(null); // creates a default executor
            server.start();
        } catch (final IOException ex) {
            ex.printStackTrace();
            wrapper.shutdown();
        }
    }
}
Java:
package de.meijr.minecraftservletwrapper;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

public class MinecraftWrapper implements HttpHandler {

    private final String sep = File.separator;
    private final String cmd = "java -jar %s nogui -Xms256M -Xmx512M";
    private final String serverDir = "e:" + sep + "minecraft" + sep;
    private final String serverJar = "minecraft_server.jar";
    private Process process = null;
    private volatile boolean receivePlayerList = false;
    private final List<String> dataList = new ArrayList<String>();

    public MinecraftWrapper() throws IOException {
        startServer();
    }

    public void startServer() throws IOException {
        process = Runtime.getRuntime().exec(
                String.format(cmd, serverJar));
        new StreamReaderThread(process.getErrorStream(),
                new ReaderListener() {

                    @Override
                    public void dataAvailable(final String data) {
                        System.out.println("ERR: " + data);
                        if (receivePlayerList) {
                            dataList.add(data);
                        }
                    }
                }).start();
        new StreamReaderThread(process.getInputStream(),
                new ReaderListener() {

                    @Override
                    public void dataAvailable(final String data) {
                        System.out.println("INP: " + data);
                        if (receivePlayerList) {
                            dataList.add(data);
                        }
                    }
                }).start();
    }

    public List<String> getPlayerList() {
        final List<String> playerList = new ArrayList<String>();
        if (process != null) {
            receivePlayerList = true;
            final BufferedOutputStream out =
                    (BufferedOutputStream) process.getOutputStream();
            try {
                final String command = "list\n";
                out.write(command.getBytes());
                out.flush();
            } catch (final IOException ex) {
                ex.printStackTrace();
            }

            // wait some time
            try {
                Thread.sleep(250);
            } catch (final InterruptedException ex) {
            }
            receivePlayerList = false;
            playerList.addAll(dataList);
            dataList.clear();
        }
        return playerList;
    }

    @Override
    public void handle(final HttpExchange t) throws IOException {
        final List<String> playerList = getPlayerList();
        final StringBuilder sb = new StringBuilder();
        sb.append("<html><title>Spielerliste</title>");
        if (playerList.isEmpty()) {
            sb.append("<body><center>Keine Spieler verbunden</center></body>");
        } else {
            sb.append("<body><lu>");
            for (final String player : playerList) {
                sb.append("<li>");
                sb.append(player);
            }
            sb.append("</lu></body>");
        }
        sb.append("</html>");

        t.sendResponseHeaders(200, sb.toString().length());
        OutputStream os = t.getResponseBody();
        os.write(sb.toString().getBytes());
        os.close();
    }

    public void shutdown() {
        process.destroy();
    }
}

Java:
package de.meijr.minecraftservletwrapper;

public interface ReaderListener {

    public void dataAvailable(final String data);
}

Java:
package de.meijr.minecraftservletwrapper;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class StreamReaderThread extends Thread {

    private final ReaderListener listener;
    private final BufferedReader reader;

    public StreamReaderThread(final InputStream inputStream,
            final ReaderListener listener) {
        this.listener = listener;
        reader = new BufferedReader(new InputStreamReader(inputStream));
    }

    @Override
    public void run() {
        try {
            while (true) {
                try {
                    if (reader.ready()) {
                        String line = null;
                        while ((line = reader.readLine()) != null) {
                            listener.dataAvailable(line);
                        }
                    }
                } catch (final IOException ex) {
                    ex.printStackTrace();
                }
                sleep(250);
            }
        } catch (final InterruptedException ex) {
            closeStream();
        }
    }

    private void closeStream() {
        if (reader != null) {
            closeStream(reader);
        }
    }

    public static void closeStream(final BufferedReader reader) {
//        try {
//            reader.close();
//        } catch (final IOException ex) {
//            ex.printStackTrace();
//        }
    }
}

du musst natürlich in der MinecraftWrapper die "serverJar" mit pfad zum mc-server versehen. wenn der wrapper gestartet wurde, kannst du mit einem browser auf http://localhst:8080/info das ergebnis sehen (eine auflistung der gerade angemeldeten spieler).

sollte als anfang ja reichen. aber wie bereits im vorherigen post erwähnt: google mal nach craftbukkit.
 
ok, ich seh jetzt (viel später) das hier dochnoch was gepostet wurde 😀

ok, ich präzisiere, es ist ein bukkitserver, und dieser hat nicht wie der normale, keine GUI. ich wollte diese (mit buttons etc) selber schreiben
 

Zurück
Oben