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{
HashMap<Integer, Prozess> prozesse = new HashMap<Integer, Prozess>();
public Prozess getProzessByPort(int port){
synchronized (this) {
return prozesse.get(port);
}
}
public void run() {
System.out.println("Starte ProzessFinder");
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;
}
System.out.println("fertig: "+(System.currentTimeMillis()-t));
}
/**
* Führt ein Commando auf der shell aus und liefert das Ergbenis als
* ArrayList<String> zurück
* @param c
* @return
* @throws IOException
*/
private 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;
}
/**
* 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;
}
}