FTP (Dateitransferprotokoll -Dateitransferprotokoll) ist ein Protokoll, das zum Übertragen von Dateien im Internet verwendet wird. Dateien können über den FTP -Server im Internet hochgeladen (hochgeladen) oder heruntergeladen (heruntergeladen) werden. FTP ist ein Echtzeit-Online-Service. Vor der Verwendung muss es ein Benutzer (Benutzername und Kennwort) mit dem Dienst sein. Bei der Arbeit muss sich der Client zuerst bei dem Server anmelden. Nach der Anmeldung kann der Benutzer Dateiensuch- und Dateiübertragung sowie andere zugehörige Operationen durchführen, z. B. das aktuelle Arbeitsverzeichnis, das Spaltendateiverzeichnis, die Einstellung von Übertragungsparametern und Übertragungsdateien usw. Verwenden Sie FTP, um alle Arten von Dateien wie Textdateien, Binärdateien, Bilddateien, Tondateien und Datenkompressionsdateien zu übertragen.
FTP -Befehle
Die Hauptoperationen von FTP basieren auf verschiedenen Befehlen. Häufig verwendete Befehle sind:
Legt den Übertragungsmodus fest, der ASCⅱ (Text) und binärer Binärmodus enthält.
Verzeichnisbetrieb, Ändern oder Anzeigen des aktuellen Verzeichnisses des Remote -Computers (CD, DIR/LS -Befehl);
Verbindungsbetrieb wird der offene Befehl verwendet, um eine Verbindung mit einem Remote -Computer herzustellen. Der Befehl schließen wird verwendet, um die Verbindung zu schließen.
Der Betrieb senden, der Befehl put wird verwendet, um Dateien auf einen Remote -Computer zu übertragen. Mit dem Befehl Put wird mehrere Dateien auf einen Remote -Computer übertragen.
Operation erhalten, den Befehl erhalten, wird verwendet, um eine Datei zu empfangen. Der Befehl mgget wird verwendet, um mehrere Dateien zu empfangen.
importieren java.net.socket; import org.apache.log4j.logger; /** * Rolle - Server A * @Author Leon * */public class Servera {public static void main (string [] args) {Final String f_dir = "c:/test"; // Root Pfad endgültig int port = 22; // Portnummer loot -logger.getRootlogger (); Logger logger = logger.getLogger ("com"); Versuchen Sie {ServerSocket S = New ServerSocket (Port); logger.info ("Verbindung zum Server A ..."); logger.info ("Verbunden erfolgreich! Lokaler Port:"+S.GetLocalport ()+". Standardverzeichnis: '"+f_dir+"'."); while (true) {// Client Request Socket Client = S.Accept () akzeptieren; // Erstellen Sie einen Service Thread New ClientThread (Client, f_dir) .Start (); }} catch (Ausnahme e) {logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); }}}} importieren java.io.bufufferedReader; Import Java.io.file; importieren java.io.filenotfoundException; importieren java.io.ioException; importieren java.io.inputstream; importieren java.io.inputStreamReader; importieren java.io.outputstream; Import Java.io.printwriter; import Java.io.randomaccessfile; importieren java.net.connectException; importieren java.net.inetaddress; importieren java.net.serversocket; importieren java.net.socket; Importieren Sie java.net.unnownhostException; importieren java.nio.charset.charset; import Java.util.random; import org.apache.log4j.logger; /** * Client -Subthread -Klasse * @Author Leon * */öffentliche Klasse ClientThread erweitert Thread {private Socket SocketClient; // Client Socket Private Logger Logger; // Login -Objekt Private String Dir; // Absolute Pfad private String pdir = "/" // Relative Path Private Final static generator = new Random (). = Client; this.dir = f_dir; } @Override public void run () {logger.getRootLogger (); logger = logger.getLogger ("com"); InputStream ist = null; OutputStream os = null; try {is = socketClient.getInputStream (); OS = SocketClient.getOutputStream (); } catch (ioException e) {logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); }} BufferedReader BR = New BufferedReader (neuer InputStreamReader (IS, charset.forname ("utf-8")); Pressewriter PW = New Printwriter (OS); String clientip = socketClient.getInetadDress (). ToString (). Substring (1); // Client ip String username = "Nicht in"; // Benutzername String password = ""; // Password String command = "; String str = ""; // Befehlsinhalt String int port_high = 0; int port_low = 0; String Retr_ip = ""; // die IP -Adresse der Empfangsdatei -Socket tempsocket = null; // Drucken Sie die Begrüßungsnachricht pw.println ("220-Fftp-Server A Version 1.0, geschrieben von Leon Guo"); pw.flush (); logger.info ("("+userername+") ("+clientip+")> verbunden, willkommene Nachricht senden ..."); logger.info ("("+userername+") ("+clientip+")> 220-ftp-Server A Version 1.0, geschrieben von Leon Guo"); boolean b = wahr; wob if (null == Befehl) brechen; } catch (ioException e) {pw.println ("331 versäumte den Befehl"); pw.flush (); logger.info ("("+userername+") ("+clientip+")> 331 konnte keinen Befehl erhalten"); logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); } b = false; } /** Zugriffskontrollbefehl* / // Benutzerbefehl if (command.toUppercase (). Startswith ("user")) {logger.info ("(nicht angemeldet) ("+clientip+")>"+Befehl); userername = command.substring (4) .trim (); if ("". Equals (Benutzername)) {pw.println ("501 Syntax -Fehler"); pw.flush (); logger.info ("(nicht angemeldet) ("+clientip+")> 501 Syntax -Fehler"); userername = "nicht angemeldet in"; } else {pw.println ("331 Passwort für" + Benutzername); pw.flush (); logger.info ("(nicht angemeldet) ("+clientip+")> 331 Passwort für"+Benutzername); } loginstus = false; } // Endbenutzer // Befehl an else if (command.touppercase (). startswith ("pass")) {logger.info ("(nicht angemeldet) ("+clientip+")>"+Befehl); password = command.substring (4) .trim (); if (userername.equals ("root") && password.equals ("root") {pw.println ("230 angemeldet an"); pw.flush (); logger.info ("("+userername+") ("+clientip+")> 230 angemeldet an"); // logger.info ("client"+clientip+"user login"); loginstus = true;} else {pw.println ("530 Login oder Passwort Falsch!"); Pass // PWD -Befehl else if (command.toUppercase (). Startswith ("pwd") {logger.info ("+userername+") ("+clientip+")> "+Befehl); pw.println ("257 /" "+pdir+" /"ist aktuelles Verzeichnis"); } else {pw.println (login_warning); pw.flush (); logger.info ("("+userername+") ("+clientip+")>"+login_warning); }} // End PWD // CWD -Befehl else if (command.touppercase (). startswith ("cwd") {logger.info ("("+userername+") ("+clientip+")>"+Befehl); if (loginStus) {str = command.substring (3) .trim (); if ("". Equals (str)) {pw.println ("250 zerbrochener Client erkannt, fehlt Argument an cwd. /" "+pdir+" /"ist aktuelles Verzeichnis."); pw.flush (); logger.info ("("+userername+") ("+clientip+")> 250 zerfuhrer Client erkannt, fehlendes Argument für cwd./"+pdir+"/" ist aktuelles Verzeichnis. ");} else {// beurteilen, ob das Verzeichnis String tmpdir = DIRR+"/"+stR; DIR = DIR+"/"+STR; aktuelles Verzeichnis "); pw.flush (); logger.info ("("+userername+") ("+clientip+")> 250 cwd erfolgreich./"+pdir+"/" ist aktuelles Verzeichnis ");} else {// Das Verzeichnis existiert nicht pw.println (" 550 cwd fehlgeschlagen. logger.info ("("+userername+") ("+clientip+")> 550 CWD fehlgeschlagen. /"+pdir+" /": Verzeichnis nicht gefunden. "); }} else {pw.println (login_warning); pw.flush (); logger.info ("("+userername+") ("+clientip+")>"+login_warning); }} // end CWD // Befehl anwenden andern if (command.touppercase (). startswith ("Quit") {logger.info ("("+userername+") ("+clientip+")>"+command); B = falsch; pw.println ("221 Goodbye"); pw.flush (); logger.info ("("+userername+") ("+clientip+")> 221 Goodbye"); try {thread.currentThread (); Thread.sleep (1000); } catch (interruptedException e) {logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); }}} // Ende beenden /** Befehl übertragen Parameter* /// Port, übertragen Sie die Daten im Modus sonst aktiv, wenn (Befehl.touppercase (). startswith ("port")) {logger.info ("("+username+") ("+clientip+")>"+Befehl); if (loginStuts) {try {str = command.substring (4) .trim (); port_low = integer.parseInt (str.substring (Str.LastIndexof (",")+1)); port_high = integer.parseInt (Str.Substring (0, Str.LastIndexof (",")) .substring (Str.Substring (0, Str. LastIndexof (",")). LastIndexof (",")+1)); String str1 = str.substring (0, str.substring (0, str. Lastindexof (",")). LastIndexof (",")); retr_ip = str1.replace (",", ",". "); Versuchen Sie {// Sofort -Socket -Tempsocket im aktiven Modus = neuer Socket (retr_ip, port_high * 256 + port_low); // logger.info ("user"+clientip+":"+userername+"port -Befehl ausführen"); pw.println ("200 Port -Befehl erfolgreich"); pw.flush (); logger.info ("("+userername+") ("+clientip+")> 200 Portbefehl erfolgreich"); } catch (ConnectException CE) {pw.println ("425 kann die Datenverbindung nicht öffnen."); pw.flush (); logger.info ("("+userername+") ("+clientip+")> 425 kann die Datenverbindung nicht öffnen."); logger.Error (ce.getMessage ()); für (stacktraceElement ste: ce.getStacktrace ()) {logger.Error (ste.toString ()); }} catch (unbekannteHostException e) {logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); }} catch (ioException e) {logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); }}} catch (numberFormatexception e) {pw.println ("503 schlechte Folge von Befehlen."); pw.flush (); logger.info ("("+userername+") ("+clientip+")> 503 Schlechte Folge von Befehlen."); logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+userername+") ("+clientip+")>"+login_warning); }} // Endport // pasv Befehl, passive Modus übertragen Daten else if (command.touppercase (). startsWith ("pasv")) {logger.info ("("+userername+") ("+clientip+")>"+Befehl); if (LoginStuts) {ServerSocket SS = NULL; while (true) {// den server kostenlosen port port_high = 1 + generator.nextint (20) abrufen; port_low = 100 + generator.nextint (1000); try {// serverbindende Ports ss = new ServerSocket (port_high * 256 + port_low); brechen; } catch (ioException e) {Fortsetzung; }} // logger.info ("user"+clientIp+":"+userername+"ausführen pasv -Befehl ausführen"); Inetaddress i = null; try {i = inetaddress.getLocalHost (); } catch (unbekannteHostException e1) {e1.printstacktrace (); } pw.println ("227 Eingeben des passiven Modus ("+I. GethostadDress (). Ersetzen (".", ",")+","+port_high+","+port_low+")"); pw.flush (); logger.info ("("+userername+") ("+clientip+")> 227 Eingabering passiver Modus ("+i.ethostadDress (). Ersetzen (".", ")+", "+port_high+", "port_low+"); Versuchen Sie {// Socket -Tempsocket im passiven Modus = ss.accept (); Ss.CLOSE (); } catch (ioException e) {logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+userername+") ("+clientip+")>"+login_warning); }} // End pasv // Befehl retrieren else if (command.touppercase (). startswith ("retrale") {logger.info ("("+userername+") ("+clientip+")>"+command); if (loginStuts) {str = command.substring (4) .trim (); if ("". Equals (str)) {pw.println ("501 Syntax -Fehler"); pw.flush (); logger.info ("("+userername+") ("+clientip+")> 501 Syntax -Fehler"); } else {try {pw.println ("150 Datenkanal für die Dateiübertragung öffnen"); pw.flush (); logger.info ("("+userername+") ("+clientip+")> 150 Datenkanal für die Dateiübertragung öffnen."); RandomAccessfile outfile = null; OutputStream outSocket = null; Versuchen Sie {// Erstellen Sie einen Zufallszugriffsdatei -Stream aus und schreiben Sie (optional) mit dem angegebenen Namen outfile = new randomAccessfile (DIR+"/"+str, "r"); outSocket = tempsocket.getOutputStream (); } catch (FilenotFoundException e) {logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); }} catch (ioException e) {logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); }} byte bytebuffer [] = new Byte [1024]; int Länge; try {while ((length = outfile.read (bytebuffer))! } outSocket.close (); outfile.close (); tempsocket.close (); tempsocket.close (); } catch (ioException e) {logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); }} // logger.info ("user"+clientIp+":"+userername+"retroll ausführen"); pw.println ("226 Transfer OK"); pw.flush (); logger.info ("("+userername+") ("+clientIp+")> 226 Übertragung ok"); } catch (Ausnahme e) {pw.println ("503 schlechte Folge von Befehlen."); pw.flush (); logger.info ("("+userername+") ("+clientip+")> 503 Schlechte Folge von Befehlen."); logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+userername+") ("+clientip+")>"+login_warning); }} // End retrab // Stor -Befehl else if (command.toUppercase (). startswith ("stor")) {logger.info ("("+userername+") ("+clientip+")>"+Befehl); if (loginStuts) {str = command.substring (4) .trim (); if ("". Equals (str)) {pw.println ("501 Syntax -Fehler"); pw.flush (); logger.info ("("+userername+") ("+clientip+")> 501 Syntax -Fehler"); } else {try {pw.println ("150 Datenkanal für die Dateiübertragung öffnen"); pw.flush (); logger.info ("("+userername+") ("+clientip+")> 150 Datenkanal für die Dateiübertragung öffnen."); RandomAccessfile infile = null; InputStream Insocket = null; try {infile = new randomAccessfile (Dir+"/"+str, "rw"); Insocket = tempsocket.getInputStream (); } catch (FilenotFoundException e) {logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); }} catch (ioException e) {logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); }} byte bytebuffer [] = new Byte [1024]; int Länge; try {while ((länge = insocket.read (bytebuffer))! = -1) {infile.write (bytebuffer, 0, länge); } Insocket.CLOSE (); infile.close (); tempsocket.close (); } catch (ioException e) {logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); }} // logger.info ("user"+clientip+":"+userername+"Befehl ausführen"); pw.println ("226 Transfer OK"); pw.flush (); logger.info ("("+userername+") ("+clientIp+")> 226 Übertragung ok"); } catch (Ausnahme e) {pw.println ("503 schlechte Folge von Befehlen."); pw.flush (); logger.info ("("+userername+") ("+clientip+")> 503 Schlechte Folge von Befehlen."); logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); }}}} else {pw.println (login_warning); pw.flush (); logger.info ("("+userername+") ("+clientip+")>"+login_warning); }} // End Stor // nlst -Befehl else if (command.touppercase (). startswith ("nlst") {logger.info ("("+userername+") ("+clientip+")>"+command); if (loginStuts) {try {pw.println ("150 Eröffnung von Datenkanal für Verzeichnisliste"); pw.flush (); logger.info ("("+userername+") ("+clientip+")> 150 Datenkanal für Verzeichnisliste öffnen."); Printwriter PWR = NULL; try {pwr = neuer Pressewriter (tempsocket.getOutputStream (), true); } catch (ioException e1) {e1.printstacktrace (); } Datei Datei = neue Datei (DIR); String [] distructure = new String [10]; Distruktur = file.list (); für (int i = 0; i <dirstructure.length; i ++) {pwr.println (Dirstructure [i]); } try {tempsocket.close (); pwr.close (); } catch (ioException e) {logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); }} // logger.info ("user"+clientip+":"+userername+"ausführen nlst -Befehl ausführen"); pw.println ("226 Transfer OK"); pw.flush (); logger.info ("("+userername+") ("+clientIp+")> 226 Übertragung ok"); } catch (Ausnahme e) {pw.println ("503 schlechte Folge von Befehlen."); pw.flush (); logger.info ("("+userername+") ("+clientip+")> 503 Schlechte Folge von Befehlen."); logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+userername+") ("+clientip+")>"+login_warning); }} // end nlst // list -Befehl else if (command.touppercase (). startswith ("list") {logger.info ("("+userername+") ("+clientip+")>"+command); if (loginStuts) {try {pw.println ("150 Eröffnung von Datenkanal für Verzeichnisliste"); pw.flush (); logger.info ("("+userername+") ("+clientip+")> 150 Datenkanal für Verzeichnisliste öffnen."); Printwriter PWR = NULL; try {pwr = neuer Pressewriter (tempsocket.getOutputStream (), true); } catch (ioException e) {logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); }} Ftputil.getDetaillist (PWR, DIR); try {tempsocket.close (); pwr.close (); } catch (ioException e) {logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); }} // logger.info ("user"+clientIp+":"+userername+"Befehl" list ausführen "); pw.println ("226 Transfer OK"); pw.flush (); logger.info ("("+userername+") ("+clientIp+")> 226 Übertragung ok"); } catch (Ausnahme e) {pw.println ("503 schlechte Folge von Befehlen."); pw.flush (); logger.info ("("+userername+") ("+clientip+")> 503 Schlechte Folge von Befehlen."); logger.Error (e.getMessage ()); für (stacktraceElement ste: e.getStacktrace ()) {logger.Error (ste.tostring ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+userername+") ("+clientip+")>"+login_warning); }} // Endliste // Geben Sie den illegalen Befehl else ein {logger.info ("("+userername+") ("+clientIP+")>"+Befehl); pw.println ("500 Syntaxfehler, Befehl nicht erkannt."); pw.flush (); logger.info ("("+userername+") ("+clientip+")> 500 Syntax -Fehler, Befehl nicht erkannt."); }} // End während Try {logger.info ("(" ("+userername+") ("+clientIp+")> getrennt. "); // logger.info (" Benutzer "+ClientIp+": "+username+" exit "); brodose (); tempsocket.close (); Java.Text.SimpledateFormat; Verzeichnis./r/n ");} file [] file = dirl.listfiles (); String modifyDate; für (int i = 0; i <files.length; i ++) {modifyDate = new SimpleDateFormat (" yyyyy/mm/dd hh: mm: ss ") .format (new matra (yyyyyyyyyyyyyyyyyyyyy). (Dateien [i] .isDirectory ()) {pw.println ("drwxr-xr-x ftp ftp 0" + modifyDate + " + Dateien [i] .GetName ()); Dateien [i] .getName ()); log4j.appender.stdout.target = system.out log4j.appender.stdout.layout = org.apache.log4j.patternLayout log4j.appender.stdout.layout.ConversionPattern = %d {Absolute} %5p %c {1}: %l - %m %n # # # # # # # # # # # # # # # # # # # # # # # # # # # teur log4j.appender.d = org.apache.log4j.dailyrollingFileAppender log4j.appender.d.file = c: /logs/logs.log log4j.appender.d.append = true ## output log4j.appender.d.threshold = debugd.appender.d.d.layout = organ.apache.aplogy log4j.appender.d.layout.ConversionPattern = %-d {yyyy-mm-dd hh: mm: ss} [ %t: %r]-[ %p] %m %n ### Ausnahmeinformationen in einer separaten Datei ### Log4j.appender.e = org. log4j.appender.e.file = c: /logs/Errors.log log4j.appender.e.append = true ## Nur Ausgabeprotokolle über der Fehlerstufe !!! %-d {yyyy-mm-dd hh: mm: ss} [ %t: %r]-[ %p] %m %nDer obige Inhalt ist das relevante Wissen über die Java -Implementierung von FTP Server -Funktionsbeispielcode, die Ihnen vom Editor vorgelegt wurden. Ich hoffe es gefällt euch.