import java.io.*; import java.net.*; public class FTPClient { public static int zustand = 0; public static Socket socket = null; public static PrintWriter out = null; public static BufferedReader in = null; public static boolean handleInput (String s) { // das kann kein Statuscode sein... if (s.length() < 3) return true; // ist das erste Zeichen eine Ziffer? if (!Character.isDigit (s.charAt(0))) return true; // kommt nach dem Statuscode ein '-'? if (s.charAt(3) == '-') return true; // Statuscode extrahieren s = s.substring (0, 3); switch (zustand) { case 0: if (s.equals ("220")) { zustand = 1; out.println ("USER ftp"); return true; } System.out.println ("falsche Eingabe: " + s); zustand = 5; return false; case 1: if (s.equals ("331")) { zustand = 2; out.println ("PASS foo@inf.ethz.ch"); return true; } System.out.println ("falsche Eingabe: " + s); out.println ("QUIT"); zustand = 4; return true; case 2: if (s.equals ("230")) { zustand = 3; out.println ("STAT"); return true; } System.out.println ("falsche Eingabe: " + s); out.println ("QUIT"); zustand = 4; return true; case 3: if (s.equals ("211")) { zustand = 4; out.println ("QUIT"); return true; } System.out.println ("falsche Eingabe: " + s); zustand = 4; return false; case 4: if (s.equals ("221")) { zustand = 5; return false; } System.out.println ("falsche Eingabe: " + s); return false; case 5: System.out.println ("unerwartete Eingabe: " + s); return false; default: System.out.println ("illegaler Zustand"); return false; } } public static void main(String[] args) throws Exception { // Verbindung zum Server herstellen socket = new Socket(args[0], 21); out = new PrintWriter(socket.getOutputStream(), true); in = new BufferedReader( new InputStreamReader(socket.getInputStream())); BufferedReader stdIn = new BufferedReader( new InputStreamReader(System.in)); String fromServer; // Eingaben lesen und auswerten while ((fromServer = in.readLine()) != null) { System.out.println("Server: " + fromServer); if (!handleInput (fromServer)) break; } // aufrauemen out.close(); in.close(); stdIn.close(); socket.close(); } }