Prüfen ob ein Programm gestartet wurde

babuschka

Top Contributor
Hallo miteinander

Ich möchte gerne per Java (am liebsten ohne Hilfe von C++/Batch etc.) testen, ob ein Programm gestartet wurde. Das ganze soll plattformunabhängig geschrieben werden. Ist so etwas in reinem Java zu verwirklichen?

Vielen Dank für eure Hilfe

Greez
 

KrokoDiehl

Top Contributor
Wenn du das Programm aus deiner Java-Anwendung heraus startest (z.B. über Runtime.exec()) dann kannst du das entsprechende Process-Objekt prüfen.

Bei einem beliebigen anderen Programm, wie The_S schon sagte: Nein.
Das "reinste" Java was mir dazu einfällt ist dass du einen Befehl vom Betriebssytem (z.B. "ps -ef" in Linux) ausführst, die Ausgabe liest und dann durchsuchst... ist aber weder wirklich plattformunabhängig noch performant.
 

The_S

Top Contributor
Du könntest auch untersuchen, ob VNC irgendwas bestimmtes macht, wenn es gestartet ist - bspw. ein Lock-File irgendwo ablegen, einen Port belegen, ... und dann das testen.
 

The_S

Top Contributor
Zuerst musst du rausfinden, OB VNC beim Start einen Port belegt. Fall es das tut, kannst du in deinem Programm selbst versuchen, den Port zu reservieren. Klappt das, kannst du davon ausgehen, dass VNC nicht läuft. Klappt es nicht, läuft VNC (oder ein anderes Programm, das sich den Port geschnappt hat). Evtl. schickt VNC auch eine bestimmte Nachricht bzw. ermöglicht eine Kommunikation über den Port. So könntest du dich zu den Port verbinden und sicher testen, ob VNC läuft oder nicht. Könnte klappen, daVNC ja auf Remote-Verbindungen wartet.
 

The_S

Top Contributor
Naja, versuchen ist recht sinnlos. Du solltest vielmehr in Erfahrung bringen (Recherche, Supportanfragen, Bedienungsanleitung, ...), ob VNC so etwas anbietet oder sogar eine API bereitstellt.
 

babuschka

Top Contributor
Hallo

Leider erstellt das VPN Programm keine Temp-Files noch gibt es eine API dazu. Dafür weiss ich, mit welchen Parametern das Programm eine Verbindung aufbaut. (Host, Port)
Mit diesen Information wollte ich nun eine SocketVerbindung via Java aufbauen, um zu prüfen, ob das Programm schon verbunden ist. (BindException => Verbindung steht bereits)

Dies wurde wie folgt geschrieben:
Java:
public static String checkVPN() {
      try {
          InetAddress host = InetAddress.getByName("xxx.xxx.xxx.xxx");
          int port = xxx; 
          
          Socket socketVpn = new Socket(host, port);
          socketVpn.close();
      } catch (BindException  portBusy){
          return portBusy.toString();
      } catch (IOException  e){
          return e.toString();
      }
      return "VPN-Client wurde nicht gestartet";  
  }

Soweit so gut, leider funktioniert dies noch nicht wie gewünscht. Wenn ich jedoch in der Konsole mit "netstat -ano" die aktiven Verbindungen anzeigen lasse, ist die VPN Verbindung klar ersichtlich und mit "HERGESTELLT" gekennzeichnet.

Ich weiss nun leider nicht wo der Fehler liegen könnte.

Vielen Dank für eure HIlfe
 

The_S

Top Contributor
Eigentlich solltest du doch nur den Port brauchen. Läuft ja lokal bei dir, also localhost als host ... oder missverstehe ich dich gerade?
 
G

Gast2

Gast
Du solltest anstatt dem Socket ein ServerSocket erstellen.
Der ServerSocket ist dafür zuständig auf einem bestimmten Port zu lauschen und Verbindungsanfragen entgegen zu nehmen.
Der Socket übernimmt die eigentliche Kommunikation zwischen zwei Endpunkten.

Wenn du in deinem Programm dann versuchst mit nem ServerSocket auf dem VPN Port zu lauschen sollte dir eine Exception um die Ohren fliegen.
 

babuschka

Top Contributor
Leider tretten keine Exceptions auf, obwohl der Port unter netstat klar ersichtlich ist. Die einzige Änderung die ich gemacht habe ist die, dass ich den Socket in ServerSocket umbenannt habe. Bin mir ehrlich gesagt auch nicht ganz im Klaren, warum ich auf dem Port lauschen soll, anstatt ihn zu belegen mit einem "normalen" Socket. Wahrscheinlich verstehe ich noch etwas falsch.

Vielen Dank für eure Hilfe
 

The_S

Top Contributor
Mit einem Socket verbindest du dich zu einem Port, könntest also mit dem Programm, das an dem Port lauscht, kommunizieren. Mit einem ServerSocket lauschst du selbst an einen Port.
 

babuschka

Top Contributor
Mit einem Socket verbindest du dich zu einem Port, könntest also mit dem Programm, das an dem Port lauscht, kommunizieren. Mit einem ServerSocket lauschst du selbst an einen Port.
In diesem Falle habe ich alles korrekt verstanden.

Ich glaube jedoch das Problem liegt woanders. Ich führe mein Programm lokal auf einem Notebook aus. (wo auch der VPN-Client gestartet wird). Der Server, auf den ich connecte, liegt jedoch irgendwo anders im Internet. Wenn ich nun lokal auf dem Notebook auf dem Port 12345 lausche, tritt niemals eine Exception auf. Wenn ich jedoch einen Lokalen Port (wird unter netstat -ano bei den Lokalen Adressen angezeigt, in der Zeile der Remoteadresse die mir bekannt ist) angebe, tritt die genannte BindException auf.
Ich bin mir nun immer noch nicht sicher, ob ich nicht den Remoteport mit einem Socket belegen muss, anstatt auf nach ihn zu lauschen.

Ich hoffe ich konnte das mehr oder weniger verständlich erklären.
 

The_S

Top Contributor
Achso, du möchtest dich von deinem Rechner auf einen anderen Rechner verbinden. Das geht so natürlich nicht. Der Client lokal muss irgendeinen Port belegen um diese Methode zu testen.
 

babuschka

Top Contributor
Gut dann haben wir uns also verstanden.:)

Würde dies dann nicht funktionieren, wenn ich mit einem Socket eine Verbindung über den bekannten Port zur bekannten Adresse aufbaue. Sollte dann nicht eine Exception auftreten, wenn eine solche Verbindung (die vom VPN Programm) schon steht?
 

The_S

Top Contributor
Hier zum Selbsttesten ;) :

Java:
		ServerSocket ss = new ServerSocket(5555);
		Socket s1 = new Socket("localhost", 5555);
		Socket s2 = new Socket("localhost", 5555);
		ss.accept();
		ss.accept();
		System.out.println(s2.isConnected() + "/" + s1.isConnected());

Außerdem heißt es ja nicht, dass VNC immer sofort nach dem Start eine Verbindung aufbaut.
 
Zuletzt bearbeitet:

babuschka

Top Contributor
Danke werde ich gleich testen und hier Rückmeldung geben. Und nochmals vielen Dank für deine grossartige Hilfe!

Hier zum Selbsttesten ;) :
Außerdem heißt es ja nicht, dass VNC immer sofort nach dem Start eine Verbindung aufbaut.
Das ist in meinem Falle auch egal. Es soll nur testen ob die Verbindung steht und ansonsten einen Hinweis ausgeben, dass man die Verbindung aufbauen soll.
 

ARadauer

Top Contributor
Das hab ich mal wo gebraucht.... vielleicht hilft es dir... is halt auf windows beschränkt...
Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.TimerTask;


public class ProzessFinder extends TimerTask{
   
   public static void main(String[] args) throws IOException {
      ProzessFinder f =new ProzessFinder();
      f.run();
      
   }

   
   private static ArrayList<String> getLinesFromCmd(String c) throws IOException{
      ArrayList<String> lines = new ArrayList<String>();
      String cmd = "cmd /c "+c;
      Process p = Runtime.getRuntime().exec(cmd);

      InputStream is =  p.getInputStream();
      BufferedReader b = new BufferedReader(new InputStreamReader(is));
      String line = null;
      while((line = b.readLine())!= null){
         lines.add(line);         
      }
      return lines;
   }
   
   HashMap<Integer, Prozess> prozesse = new HashMap<Integer, Prozess>();

   
   public Prozess getProzessByPort(int port){
      synchronized (this) {
         return prozesse.get(port);
      }      
   }

   
   
   public void run() {
      long t = System.currentTimeMillis();

      HashMap<Integer, Prozess> tempProzesse = new HashMap<Integer, Prozess>();
      Prozess aktP = null;

      ArrayList<String> lines = null;
      try {
         lines = getLinesFromCmd("netstat -b");
      } catch (IOException e1) {
         return;
      }
      for(String line: lines){
         line = line.trim();
         if(line.length()==0) //nix
            continue;
         if(line.startsWith("[") && aktP != null){
            aktP.setName(line.substring(1, line.length()-1));
            tempProzesse.put(aktP.getPort(), aktP);
            aktP=null;
         }else {
            ArrayList<String> parts = getParts(line);
            if(parts.size()!=5)
               continue;
            int portNum = -1;
            try {
               String port = parts.get(1).split(":")[1];
               portNum = Integer.parseInt(port);
            } catch (Exception e) {
               continue;
            }
            aktP = new Prozess();
            aktP.setPort(portNum);
         }

      }
      synchronized (this) {
         prozesse = tempProzesse;
         //zu debug zwecken
         for(Integer port : prozesse.keySet()){
            System.out.println(port+" "+prozesse.get(port).getName());
         }
      }    
   
   }
   
   


   /**
    * Führt ein Commando auf der shell aus und liefert das Ergbenis als
    * ArrayList<String> zurück
    * @param c
    * @return
    * @throws IOException
    */
   


   /**
    * erstellt aus einer Zeile mit space getrennten Spalten fester Größe
    * eine ArrayList
    * @param line
    * @return
    */
   private static ArrayList<String> getParts(String line){
      ArrayList<String>  result = new ArrayList<String>();
      StringBuilder b = null;
      for(char c : line.toCharArray()){
         if(c!=' '){
            if(b==null){
               b = new StringBuilder(); 
            }
            b.append(c);
         }else{
            if(b!=null){
               result.add(b.toString());
               b=null;
            }
         }
      }

      if(b!=null)
         result.add(b.toString());

      return result;


   }


}
Java:
public class Prozess {
   String name;
   int port;
   
   
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public int getPort() {
      return port;
   }
   public void setPort(int port) {
      this.port = port;
   }

   public String toString(){
      return name+"-"+port;
   }


}
 

babuschka

Top Contributor
Danke für den Code. Das Programm sollte jedoch plattformunabhängig laufen. Deshalb weiche ich auch auf die eher spezielle Port überprüfung aus.

+++++++++++UPDATE++++++++++++++++
Möchte hier noch erwähnen das ich mein Problem auf eine andere Weise lösen konnte. Ich werde diese Lösung hier nicht posten, da sie nur in meinem kleinen Spezialfall funktioniert und somit überflüssig wäre.

Trotzdem nochmals Danke an alle die hier geholfen haben.
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Programm auf Installation prüfen Allgemeine Java-Themen 1
L Prüfen, ob Programm über 32bit oder 64bit Java ausgeführt wird Allgemeine Java-Themen 4
8u3631984 Prüfen ob min. ein Element eines Sets in einem anderen Set enh Allgemeine Java-Themen 4
OnDemand Prüfen ob Bild defekt ist Allgemeine Java-Themen 4
N Prüfen, ob ein String 2x das selbe Zeichen hat Allgemeine Java-Themen 10
W Classpath Reflexion - Prüfen ob man auf ein Feld ändern kann Allgemeine Java-Themen 2
OnDemand Bild prüfen ob defekt Allgemeine Java-Themen 3
B Java Mail: Prüfen, ob Email hat ein Anhang oder nicht Allgemeine Java-Themen 2
Bluedaishi Prüfen ob Datei noch geöffnet ist Allgemeine Java-Themen 59
Stonie Prüfen von direkter Implementierung eines Interfaces Allgemeine Java-Themen 7
J Mit Lombok Integer Range prüfen Allgemeine Java-Themen 6
S Prüfen ob Textfile existiert Allgemeine Java-Themen 9
S Binärbaum prüfen Allgemeine Java-Themen 0
L String auf zahlenwert prüfen Allgemeine Java-Themen 13
W Datum prüfen + zweistellig Allgemeine Java-Themen 11
perlenfischer1984 Functionsparameter prüfen und eine Exception werfen !? Allgemeine Java-Themen 11
Z Java Exceptions - Auf leeres Feld prüfen Allgemeine Java-Themen 10
F Wie kann ich auf einem System prüfen, ob eine lib verfügbar ist? Allgemeine Java-Themen 2
P Prüfen ob es Variable mit Namen gibt der als String übergeben wird Allgemeine Java-Themen 7
M .jar nach Datei prüfen Allgemeine Java-Themen 2
B Existenz eines Files max 30 sec prüfen Allgemeine Java-Themen 5
B Prüfen, ob ein Element in der Liste nicht existiert Allgemeine Java-Themen 3
F Cardlayout prüfen ob schon vorhanden, keine doppelten Allgemeine Java-Themen 3
turmaline Regex gegen Regex prüfen Allgemeine Java-Themen 4
S Lambda Ausdrücke: @FunctionalInterface Instanzen auf null prüfen Allgemeine Java-Themen 9
D ArrayList index auf gültigkeit prüfen Allgemeine Java-Themen 12
C Best Practice [Arrays] Wie sinnvoll prüfen, ob Array primitive Datentypen enthält? Allgemeine Java-Themen 6
K Methoden Arrays auf true Werte prüfen Allgemeine Java-Themen 4
Y Prüfen ob ein Graph immer einen von mehren Enden erreicht Allgemeine Java-Themen 4
O Prüfen ob String eine Zahl mit maximal 2 Nachkommastellen ist Allgemeine Java-Themen 4
M datei aufruf prüfen Allgemeine Java-Themen 9
D Best Practice Prüfen ob jar nachträglich geändert wurde Allgemeine Java-Themen 2
B Dateien prüfen auf Gleichheit Allgemeine Java-Themen 5
H String auf Zahlen prüfen Allgemeine Java-Themen 4
T auf Valides Datum prüfen Allgemeine Java-Themen 12
N Java Version Prüfen lassen Allgemeine Java-Themen 11
S Variablen Prüfen ob Number vom Typ Integer, Float, Double, ... ist Allgemeine Java-Themen 2
E selber Klassen kompilieren/ prüfen Allgemeine Java-Themen 5
O Variablen Originalname einer übergebenen Variable prüfen Allgemeine Java-Themen 9
T Methoden Zahlenpalindrom laufzeitoptimiert prüfen Allgemeine Java-Themen 4
U ResourceBundles auf vollständigkeit prüfen Allgemeine Java-Themen 2
C jollyday: prüfen, ob Datum = Feiertag Allgemeine Java-Themen 8
C Prüfen ob sich ein Punkt innerhalb einer Kugel befindet (Java3D,nicht-lineare GLS) Allgemeine Java-Themen 5
M Objekt prüfen auf null ->Invocation Target Exception??? Allgemeine Java-Themen 2
E Prüfen ob Fenster mit Namen offen ist Allgemeine Java-Themen 2
M Binärbaum auf vollständigkeit prüfen Allgemeine Java-Themen 4
S Mail Adressen Syntax prüfen Allgemeine Java-Themen 22
O Text mit Wildcard gegen regulären Ausdruck prüfen Allgemeine Java-Themen 3
N List auf null prüfen Allgemeine Java-Themen 2
B generischen Typ prüfen Allgemeine Java-Themen 7
D prüfen, ob Enums bestimmte Elemente enthalten Allgemeine Java-Themen 3
N Prüfen ob Methode ausgeführt wird und diese ggf. abbrechen? Allgemeine Java-Themen 8
N ArrayList nach Reihenfolge prüfen Allgemeine Java-Themen 2
C Prüfen auf Zahl und 6 stellig fehlerhaft? warum? Allgemeine Java-Themen 7
D Wie prüfen, ob ein String Teil eines Enum Types ist? Allgemeine Java-Themen 12
H Prüfen, ob doppete Werte in int-Array vorhanden sind Allgemeine Java-Themen 16
data89 Bilder mit Java prüfen - suche dringend Hilfe Allgemeine Java-Themen 8
S Prüfen auf Hex-Wert fester Länge! Allgemeine Java-Themen 5
M Prüfen, welche anderen Programme laufen Allgemeine Java-Themen 5
K Zip dateien prüfen Allgemeine Java-Themen 3
G ZIP Archiv auf Konsistenz prüfen Allgemeine Java-Themen 2
T Parameter einer Klasse auf Interface prüfen Allgemeine Java-Themen 6
L Passwort mit Regulärem Ausdruck prüfen Allgemeine Java-Themen 6
P Sound Buffer prüfen Allgemeine Java-Themen 12
B PrintService - Wie prüfen ob Drucker online ist? Allgemeine Java-Themen 2
A Textfeld prüfen, ob ein Punkt eingegeben wurde Allgemeine Java-Themen 8
flashfactor Prüfen ob bereits eine Instanz gestartet ist Allgemeine Java-Themen 2
C Prüfen, ob eine Methode eine andere überschreibt! WIE? Allgemeine Java-Themen 8
T Prüfen, ob Char ein Quantifier ist Allgemeine Java-Themen 6
N Prüfen ob Objekt in Liste enthalten ist Allgemeine Java-Themen 17
G Prüfen welche JRE-Version gebraucht wird Allgemeine Java-Themen 19
J Mit Patternmatching einen Satz prüfen Allgemeine Java-Themen 12
G Prüfen ob Ziffern einer Zahl pandigital sind? Allgemeine Java-Themen 15
M Prüfen ob Variable vorhanden / initalisiert ist Allgemeine Java-Themen 4
J Wie prüfen ob eine Datei vom OS fertig geschrieben wurde? Allgemeine Java-Themen 6
TheJavaKid Zeile auf existenz von String prüfen. Allgemeine Java-Themen 19
A Weshalb man Parameter auf Gültigkeit prüfen sollte Allgemeine Java-Themen 6
N Prüfen ob ein String in einen Integer umgewandelt werden kan Allgemeine Java-Themen 4
O String auf zahlen prüfen (java 1.3) Allgemeine Java-Themen 4
G Datei Zugriffsrechte prüfen Allgemeine Java-Themen 2
Linad Bilder auf Gleichheit prüfen Allgemeine Java-Themen 6
G ResultSet auf Inhalt prüfen? Allgemeine Java-Themen 2
H Prüfen, ob es sich um ein Integer handelt Allgemeine Java-Themen 4
C String str prüfen Allgemeine Java-Themen 3
H Prüfen ob ein String grösser als 4 Zeichen ist Allgemeine Java-Themen 3
F Prüfen, ob Windows oder UNIX Allgemeine Java-Themen 2
Jose05 Umgang mit Exceptions in einen Programm Allgemeine Java-Themen 2
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
R Programm führt Methoden gleichzeitig aus Allgemeine Java-Themen 2
T Der Aufruf von CMD-Programm Allgemeine Java-Themen 30
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
Mike80 Processing Programm fiert ohne Arduino ein Allgemeine Java-Themen 2
B Mysteriöse Ergebnisse beim Baccarat Programm? Allgemeine Java-Themen 13
districon Programm zum Durchsuchen von (Ebay-)Artikeln Allgemeine Java-Themen 1
T Addons im eigenen Programm Allgemeine Java-Themen 1
Calli11 Was muss ich hier in die Main schreiben, damit das Programm ausgeführt wird? Allgemeine Java-Themen 4
S .exe Datei/Programm auslesen? Allgemeine Java-Themen 2
S Formel für Sonnenwinkel in ein Programm überführen Allgemeine Java-Themen 11
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45

Ähnliche Java Themen

Neue Themen


Oben