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;
}
}