Wenn du das Programm aus deiner Java-Anwendung heraus startest (z.B. über Runtime.exec()) dann kannst du das entsprechende Process-Objekt prüfen.
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";
}
In diesem Falle habe ich alles korrekt verstanden.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.
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());
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.Hier zum Selbsttesten :
Außerdem heißt es ja nicht, dass VNC immer sofort nach dem Start eine Verbindung aufbaut.
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;
}
}
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;
}
}