Check ob Dateien auf Webspace verfügbar sind

Looky

Erfahrenes Mitglied
Hallo zusammen,

ich würde gerne mit einem Java Programm checken, ob bestimmte Dateien auf einem Webserver verfügbar sind und gelesen werden können. Das am besten so schnell wie möglich.

bisher habe ich eine URLConnection genommen und dann den Inputstream und einfach das erste byte gelesen. Wenn das geht, weiß ich das die Datei in Ordnung ist. Gibt es einen schnelleren Weg?

Danke
Christian
 
Hi,

Am einfachsten wäre es den Response vom Server auszuwerten bsp: HTTP 200 bzw. 404...denn das erste Byte der "Datei" könnte auch von einer 404er Seite stammen...ansonsten gibts nicht wirklich viele Alternativen...

hmf
 
Ja, HTTP-konforme GET-Message absenden und die Statuszeile der Antwort auswerten.

Diese ist dann wie folgt aufgebaut:
Code:
HTTP/1.1 xxx text
wobei xxx der Statuscode (404 für nicht gefunden, 200 für OK) und text eine (optionale) Klartextnachricht ist.

Schneller geht's nicht.
 
hatte mal was ähnliches fürs studium bauen müssen, habe es etwas angepasst...sollte so ungefähr funktionieren

Code:
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TCPClient
{

	/**
	 * RegenExe um rauszufinden ob eine Weiterleitung existiert
	 */
	private static final Pattern location = Pattern.compile( "^Location:(?:\\s)(?:(?:.+?)//)?([a-zA-z0-9\\.\\-_]*)(?::)?([0-9]*)?(.+?)?$");
	
	/**
	 * RegenExe um den HTTP-Status und die Version zu filtern
	 */
	private static final Pattern state = Pattern.compile( "^(?:.+?)([\\.0-9]+)(?:\\s)([0-9]*)(?:\\s)(?:.+?)?$");
	
	/**
	 * Default HTTP - Port
	 */
	private static final int httpStdPort = 80;
	
	public static void main( String[] args)
    {
			

		/* ---------------- Programmargumente ---------------- */ 
		
		String  protocoll = "http",
		                host = null,
		                urlPath = "/",
		                file = null;
		
		int port = httpStdPort;
		
		// Komandozeile parsen
		for( int i=0; i<args.length; i+=2)
		{
		
	        // Port
	        if( args[ i].equals( "-p"))
	        {
	        	port = Integer.parseInt( args[ i + 1]);
	        }
	        // Host
	        else if( args[ i].equals( "-h"))
	        {
	        	host = args[ i + 1];
	        }
	        // URL - Path
	        else if( args[ i].equals( "-u"))
	        {
	        	urlPath = args[ i + 1];
	        }
	        // Ausgabedatei
	        else if( args[ i].equals( "-f"))
	        {
	        	file = args[ i + 1];
	        }
		
		}
		
		// Prüfen ob ein Host angegeben wurde
		if( null!=host)
		{
		
			try
			{
				
				// Ausgabe in eine Datei oder StdOut
				OutputStream fout = ( null!=file) ? new FileOutputStream( file) : System.out;
			
				// HTTP - Request senden
	        	if( TCPClient.httpRequest( fout, host, port, urlPath)){
	        		System.out.println( "Datei gefunden");
	        	}else{
	        		System.out.println( "Datei nicht vorhanden");
	        	}
	        		
		        
		        // Ausgabestream schliessen
		        fout.close();
			
			}
			catch( IOException ioEx)
			{
			        ioEx.printStackTrace();
			}
			
		}
		else
	        System.out.println( "Usage: eg. [-p 80] -h localhost [-u /] [-f outfile]");

    }

	/**
	 * Sendet einen HTTP GET Request an einen gewünschten Server, falls der Server einen Redirect sendet so wird diesem gefolgt.
	 * 
	 * @param fout Ausgabestrom
	 * @param host gewünschter Server
	 * @param port Port des Servers
	 * @param urlPath Path der Datei
	 * 
	 * @throws IOException Tritt auf wenn ein E/A Fehler aufgetretten ist
	 */
	private static boolean httpRequest( OutputStream fout, String host, int port, String urlPath)throws IOException
	{
		
		// Socket öffnen
		Socket socket = new Socket( host, port);
		
		// Socket OutputStream
		PrintStream out = new PrintStream( socket.getOutputStream());
		
		// Socket InputStream
		BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream()));
		
		// Request senden
		out.println( "GET "+urlPath+" HTTP/1.0\n");
				
		String line;
		
		int httpStatus = 0;
		
		// Einlesen des HTTP - Headers
        while( null != ( line = in.readLine()) && 0<line.length())
        {
        	
        	System.out.println(line);
        	
        	// Status des Servers auswerten
        	if( 0==httpStatus)
        	{
        		
	        	Matcher matchHTTPState = state.matcher( line);
	        	
	        	if( matchHTTPState.find())
	        		httpStatus = Integer.parseInt( matchHTTPState.group( 2));
        	
        	}
        	else
	        {
	        
        		socket.close();
        		
        		return ( 200==httpStatus);
	    		
	        }
    					
        }
        
        if( fout.equals( System.out))
        	System.out.print( "\n");
        
		if( !socket.isClosed())
			socket.close(); 		// Verbindung schliessen
		
		return false;
        
	}
	
	
}
 
Zurück