Mit Java auf die Konsole eines Process-Objekts zugreifen

  • Themenstarter Themenstarter Gelöschtes Mitglied 34033
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 34033

Gast
hallöchen
ich habe eine java anwendung die man mit konsole startet und dann kann man da verschiedene commands mit der batch-syntax eingeben
jetzt möchte ich diese commands über ein externes programm eingeben lassen also habe ich mir erstmal ein process-object mit Runtime.getRuntime().exec() geholt
ich dachte jetzt so könnte ich den command eingeben:
Java:
BufferedOutputStream os = (BufferedOutputStream) process.getOutputStream();
os.write("<command>\n".getBytes());
os.flush();
aber es geschiet gar nichts
weiß jemand vlt wie das geht?
danke im vorraus!
thecreeper202x
 
Java:
os.write("<command>\n".getBytes());
Das ist eine ziemlich krüppelige und wahrscheinlich auch nicht funktionsfähige Art, ein Kommando mit abschließendem Enter einzugeben (wird das "\n" wirklich als Enter erkannt? Komt bei getBytes() wirklich der String in Byteform raus?). Probiere mal folgende Variante:
Java:
   final OutputStream procOs = proc.getOutputStream();´

   // Wir wollen Zeichen schreiben, dafür gibt es bei Java Writer
   // Wir benutzen den PrintWriter, damit wir per "println(...)" das
   // Kommando gleich mit Enter abschließen.
   final PrintWriter procWriter = new PrintWriter(procOs);

   procWriter.println("command");
   
   procWriter.flush();
 
@anti-held
das habe ich garnich gemeint
@nillehammer
funzt nich, also ich bekomm in process.getInputStream() und process.getErrorStream() keine antwort
 
@nillehammer
funzt nich, also ich bekomm in process.getInputStream() und process.getErrorStream() keine antwort
Hä??? Hab ich noch nie gehabt. Entweder, es kommt ein Stream oder es fliegt eine Exception. "Keine Antwort" als Verhalten ist mir neu. Verschluckst Du etwa Exceptions (leere catch-Blöcke)? Das ist immer eine ziemlich schlechte Idee. Zeig vielleicht auch mal den Code, mit dem Du Dir den Process holst.

[EDIT]Und wieso reden wir jetzt plötzlich von den InputStreams? Deine Frage war doch nach dem OutputSteam?!?[/EDIT]

[EDIT]:idea:Aso, jetzt schnall ich's. Du schreibst das Kommando und erwartest natürlich von einem der beiden InputStreams eine Reaktion, die kommt aber nicht... Ja, dann zeig bitte den vollständigen Code. Idealerweise so, dass man ihn kopieren und lokal ausführen kann.:idea:[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
ConsoleRW.java
Java:
package de.creeperfans.crw;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import java.awt.Desktop;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Roman
 */
public class ConsoleRW implements Runnable, HttpHandler {
    
    private Process process;
    
    private int port;
    private HttpServer server;
    
    private boolean running;
    

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new Thread(new ConsoleRW()).start();
    }

    @Override
    public void run() {
        try {
            process = Runtime.getRuntime().exec("java -Xmx1024M -Xms1024M -jar craftbukkit.jar");
            port = 12345;
            running = true;
            server = HttpServer.create(new InetSocketAddress(port), 10);
            server.createContext("/", this);
            server.setExecutor(null);
            server.start();
            setUp();
            update();
            Desktop.getDesktop().browse(new URI("http://localhost:" + port + "/"));
            while (running) {
                update();
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(ConsoleRW.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } catch (URISyntaxException ex) {
            Logger.getLogger(ConsoleRW.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ConsoleRW.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void handle(HttpExchange he) throws IOException {
        StringBuilder html = new StringBuilder();
        html.append("<html><head><title>Minecraft Server</title></head><body><h1>Minecraft Server</h1><br><h2>Players</h2><br><ul>");
        for (String player : playerList) {
            html.append("<li>");
            html.append(player);
            html.append("</li>");
        }
        html.append("</ul>");
        he.sendResponseHeaders(200, html.toString().length());
        OutputStream os = he.getResponseBody();
        os.write(html.toString().getBytes());
        os.close();
    }
    
    private boolean setup = true;
    
    private void setUp() throws IOException {
        System.out.println("==SetUp==");
        new StreamReaderThread(process.getInputStream(), new ReaderListener() {

            @Override
            public void dataAvailable(String data) {
                if (data.equals(">") || setup) {
                    return;
                }
                playerList.add(data);
                System.out.println(data);
            }
        }).start();
        new StreamReaderThread(process.getErrorStream(), new ReaderListener() {

            @Override
            public void dataAvailable(String data) {
                if (!setup) {
                    //return;
                }
                System.out.println(data.replaceAll("[0-9][0-9]:[0-9][0-9]:[0-9][0-9] \\[([a-zA-Z]*)\\] (.*)", "$1 >> $2"));
                if (data.matches("[0-2][0-9]:[0-9][0-9]:[0-9][0-9] \\[INFO\\] Done .*")) {
                    setup = false;
                }
            }
        }).start();
        while (setup) {
            try {
                Thread.sleep(250);
            } catch (InterruptedException ex) {
                Logger.getLogger(ConsoleRW.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
    private List<String> playerList = new ArrayList<String>();

    private void update() throws IOException {
        System.out.println("==Update==");
        updatePlayerList();
    }

    private void updatePlayerList() throws IOException {
        System.out.println("> Updating player list...");
        //mein code (kann auch deiner sein :D)
        BufferedOutputStream os = (BufferedOutputStream) process.getOutputStream();
        os.write("list\n".getBytes());
        os.flush();
        //mein code ende
        try {
            Thread.sleep(250);
        } catch (InterruptedException ex) {
            Logger.getLogger(ConsoleRW.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println("> Player list updated!");
    }
}
StreamReaderThread.java
Java:
package de.creeperfans.crw;

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();
//        }
    }
}
ReaderListener.java
Java:
package de.creeperfans.crw;

public interface ReaderListener {
 
    public void dataAvailable(final String data);
}
[EDIT]Und wieso reden wir jetzt plötzlich von den InputStreams? Deine Frage war doch nach dem OutputSteam?!?[/EDIT]
ich kann ja nur sehen obs funzt wenn ich auch ne antwort bekomme (jeder command gibt ne antwort)

achja hier die datei die ausgeführt wird: Get Bukkit
 
Zuletzt bearbeitet von einem Moderator:
Ok, danke für den Code. Da passiert ja ziemlich viel drumrum (HTTP-Krams, Unterschiedliche Threads). Das macht es dir unnötig schwar, das eigentliche Problem einzukreisen. Löse am besten mal den Teil heraus, bei dem Du die Java-Anwendung startest und probier erst den mit wohldefinierten Test-Eingaben in einem single Thread. Außerdem änder auf jeden Fall mal die Zeile:
[JAVA=42]
process = Runtime.getRuntime().exec("java -Xmx1024M -Xms1024M -jar craftbukkit.jar");
[/code]
Kommandozeilenparameter werden anders übergeben und zwar so:
Java:
process = Runtime.getRuntime().exec("java", "-Xmx1024M", "-Xms1024M", "-jar", "craftbukkit.jar");
 
Ok, danke für den Code. Da passiert ja ziemlich viel drumrum (HTTP-Krams, Unterschiedliche Threads). Das macht es dir unnötig schwar, das eigentliche Problem einzukreisen. Löse am besten mal den Teil heraus, bei dem Du die Java-Anwendung startest und probier erst den mit wohldefinierten Test-Eingaben in einem single Thread. Außerdem änder auf jeden Fall mal die Zeile:
[JAVA=42]
process = Runtime.getRuntime().exec("java -Xmx1024M -Xms1024M -jar craftbukkit.jar");
[/code]
Kommandozeilenparameter werden anders übergeben und zwar so:
Java:
process = Runtime.getRuntime().exec("java", "-Xmx1024M", "-Xms1024M", "-jar", "craftbukkit.jar");
1. das geht nich mit Runtime.getRuntime().exec() sondern nur mit ProcessBuilder
2. wieso wenn man in die konsole guckt alles passt nur keine antwort beim command
 
Das stimmt nicht. Habe gerade keine älteren Javas da, aber bei Java 7 geht das definitiv.

ich habe java 7
außerdem hab ich was nachgelesen:
die methode getOutputStream() kann einen null output stream zurückgeben. ich hab zwar schonmal von einem null output stream gehöhrt aber weiß nicht was das ist
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Zurück
Oben