# Checken, ob ein Programm auf einem Port "hört"



## lukelukeluke (12. April 2006)

Hallo zusammen,
Ich bin am Entwickeln einer Java Applikation. Dabei möchte ich eine Statusanzeige einbauen, bei welcher man von verschiedenen Servern/PCs sehen kann, ob auf einem gewissen Port ein Programm läuft (nicht nur ein Scan, ob der Port offen ist).
Beispielsweise will ich sehen, ob der Server mit der IP *192.168.1.24* auf Port *5120* gerade ein Server-Programm laufen hat, welches Verbindungen annimmt. Gibt es eine generelle Funktion für das? Müsste man für jeden solchen Test per Socket-Verfahren connecten?
Danke,
-luke


----------



## elmato (12. April 2006)

Ich bin kein Netzwerk Spezialist aber ich würde schon sagen das du Sockets brauchst, wenn er sich garnicht erst connected dann läuft auf dem Port auch gerade nichts, wie du ihn jetzt aber dazu kriegen kannst zu erfahren was denn da läuft weiss ich auch nicht..

mfg
elmato


----------



## lukelukeluke (20. April 2006)

Hi,
Es geht tatsächlich mit Sockets. Nach langem probieren habe ich folgendes herausgefunden:

```
try {
         String host = "123.123.123.123";
         int port = 80;
         InetAddress ia = InetAddress.getByName(host);
         Socket s = new Socket(ia, port);
         System.out.println("A server is listening on port "+port+" of "+host);
         s.close();
}
catch (IOException ex) {
         System.out.println("No Server is listening on port "+port+" of "+host);
}
```
Was nun aber noch das Problem ist: Wenn dieser Port nicht frei ist, dann geht es sehr lange das herauszufinden. Wie kann ich nun ein Timeout für die Verbindung programmieren, dass wenn er nach 1 Sekunde keinen offenen Port gefunden hat, den Port automatisch als geschlossen betrachtet?
Ein Socket-Timeout kann man ja so programmieren: *Socket.setSoTimeout(int milliseconds);*
Jedoch nutzt es nichts, da der Socket ja beim Erstellen schon verbindet, der Code müsste früher stehen...?


----------



## Thomas Darimont (20. April 2006)

Hallo!


```
/**
 * 
 */
package de.tutorials;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * @author tom
 * 
 */
public class SocketConnectTimeoutExample {

    /**
     * @param args
     * @throws IOException
     * @throws UnknownHostException
     */
    public static void main(String[] args) throws UnknownHostException,
            IOException {

        Socket socket = null;
        long time = -System.currentTimeMillis();
        try {
            socket = new Socket();
            socket.connect(new InetSocketAddress("www.google.de", 4711), 3000);

        } finally {
            if (socket != null) {
                socket.close();
            }
            System.out.println(time + System.currentTimeMillis());
        }
    }
}
```

Gruss Tom


----------



## lukelukeluke (31. August 2006)

Hallo Thomas,
Danke für deine Antwort!
Deine Klasse scheint zu funktionieren...
Jedoch wenn ich von hier aus auf der Commandline google.de anpinge, krieg ich immer ca. 40, mit dieser funktion manchmal ganz andere Werte als 3040.
Ausserdem müsste es doch auch noch einen Weg geben, das nicht immer das Tiemout abgewartet werden muss, oder? also die verwendete Zeit scheint immer 3000 (Timeout) + Ping zu sein...
Gruss, Luke


----------

