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

lukelukeluke

Erfahrenes Mitglied
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
 
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
 
Hi,
Es geht tatsächlich mit Sockets. Nach langem probieren habe ich folgendes herausgefunden:
Code:
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...?
 
Hallo!

Code:
/**
 * 
 */
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
 
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
 
Zurück