FTP (Protocole de transfert de fichiers Protocole de transfert de fichiers) est un protocole utilisé pour transférer des fichiers sur Internet. Les fichiers peuvent être téléchargés (téléchargés) ou téléchargés (télécharger) via le serveur FTP sur Internet. FTP est un service en ligne en temps réel. Avant de l'utiliser, il doit s'agir d'un utilisateur (nom d'utilisateur et mot de passe) avec le service. Lorsque vous travaillez, le client doit d'abord se connecter à l'ordinateur qui est le serveur. Après la connexion, l'utilisateur peut effectuer la recherche de fichiers et le transfert de fichiers et d'autres opérations connexes, telles que la modification du répertoire de travail actuel, le répertoire de fichiers de colonne, la définition des paramètres de transmission et des fichiers de transfert, etc. Utilisez FTP pour transférer tous les types de fichiers, tels que les fichiers texte, les fichiers binaires, les fichiers image, les fichiers sonores et les fichiers de compression de données.
Commandes FTP
Les principales opérations de FTP sont basées sur diverses commandes. Les commandes couramment utilisées sont:
Définit le mode de transmission, qui comprend le mode binaire ASCⅱ (texte) et binaire;
Fonctionnement du répertoire, modification ou affichage du répertoire actuel de l'ordinateur distant (commande cd, dir / ls);
Opération de connexion, la commande ouverte est utilisée pour établir une connexion avec un ordinateur distant; La commande Close est utilisée pour fermer la connexion;
Envoi de l'opération, la commande put est utilisée pour transférer des fichiers vers un ordinateur distant; La commande put est utilisée pour transférer plusieurs fichiers sur un ordinateur distant;
Get Operation, Get Commande est utilisée pour recevoir un fichier; La commande mgget est utilisée pour recevoir plusieurs fichiers.
import java.net.socket; import org.apache.log4j.logger; / ** * Rôle - Server A * @author leon * * / public class Servera {public static void main (String [] args) {final String f_dir = "c: / test"; // root pathwer int Port = 22; // écouter le numéro de port.GetRootLogger (); Logger logger = logger.getLogger ("com"); try {serversocket s = new serversocket (port); Logger.info ("Connexion au serveur a ..."); Logger.info ("Connected réussi! Port local:" + s.getLocalport () + ". Répertoire par défaut: '" + f_dir + "'."); while (true) {// accepter le socket de demande client client = s.accept (); // Créer un thread de service Nouveau ClientThread (client, f_dir) .start (); }} catch (exception e) {logger.error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); }}}} Importer java.io.bufferedReader; Importer java.io.file; import java.io.filenotfoundException; Importer java.io.ioException; import java.io.inputStream; Importer java.io.inputStreamReader; import java.io.outputStream; import java.io.printwriter; import java.io.randomaccessfile; import java.net.connectException; Importer java.net.inetAddress; import java.net.serversocket; import java.net.socket; import java.net.unknownhostException; import java.nio.charse.Charset; import java.util.random; import org.apache.log4j.logger; / ** * CLASSE CLATIVE CLASSE DE SUBSE * @Author Leon * * / Classe publique ClientThread étend Thread {private socket socketClient; // Client Socket Private Logger; // Loggin Object Private String Dir; // Absolute Path String Private PDir = "/"; client; this.dir = f_dir; } @Override public void run () {logger.getRootLogger (); logger = logger.getLogger ("com"); InputStream est = null; OutputStream os = null; try {is = socketClient.getInputStream (); os = socketClient.getOutputStream (); } catch (ioException e) {logger.Error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); }} BufferedReader br = new BufferedReader (new InputStreamReader (IS, charset.forname ("utf-8"))); Printwriter pw = new PrintWriter (OS); String clientIP = socketClient.getInEtAddress (). ToString (). Substring (1); // enregistrer le client IP String username = "non enregistré"; // nom d'utilisateur String mot de passe = ""; // mot de passe String Commande = ""; // Commande Boolean LogginStus = false; // Login Status String Login_warning = "530 String str = ""; // contenu de commande String int port_high = 0; int port_low = 0; String RetT_ip = ""; // L'adresse IP de la prise de fichier de réception tempsocket = null; // Imprime le message de bienvenue PW.println ("Serveur 220-FTP Une version 1.0 écrite par Leon Guo"); pw.flush (); logger.info ("(" + nom d'utilisateur + ") (" + clientp + ")> connecté, envoyant le message de bienvenue ..."); Logger.info ("(" + nom d'utilisateur + ") (" + ClientIp + ")> Serveur 220-FTP Une version 1.0 écrite par Leon Guo"); booléen b = vrai; while (b) {try {// Obtenez la commande entrée par la commande utilisateur = br.readline (); if (null == Command) Break; } catch (ioException e) {pw.println ("331 a échoué à obtenir la commande"); pw.flush (); logger.info ("(" + nom d'utilisateur + ") (" + clientp + ")> 331 a échoué à obtenir la commande"); Logger.Error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); } b = false; } / * * Commande de contrôle d'accès * / // Commande utilisateur if (Command.ToupperCase (). StartSwith ("user")) {logger.info ("(non connecté) (" + clientrip + ")>" + commande); username = Command.SubString (4) .trim (); if ("". equals (nom d'utilisateur)) {pw.println ("501 Erreur de syntaxe"); pw.flush (); Logger.info ("(non connecté) (" + clientIp + ")> 501 Erreur de syntaxe"); username = "non connecté"; } else {pw.println ("331 Mot de passe requis pour" + nom d'utilisateur); pw.flush (); Logger.info ("(non connecté) (" + ClientIp + ")> 331 Mot de passe requis pour" + nom d'utilisateur); } loginstus = false; } // End User // Pass Command else if (Command.toupperCase (). startSwith ("pass")) {logger.info ("(non connecté) (" + clientrip + ")>" + commande); mot de passe = Command.SubString (4) .trim (); if (username.equals ("root") && mot de passe.equals ("root")) {pw.println ("230 connecté"); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientp + ")> 230 connecté"); // logger.info ("client" + clientIp + "" Login "utilisateur"); loginstus = true;} else {pw.println ("530 connexion ou mot de passe incorrect!"); pw.flush (); logger.info ("(non logé dans) (" + clientip + ")> 530 Login ou mot de passe! } // end Pass // Commande pwd else if (command.toupperase (). startSwith ("pwd")) {Logger.info ("(" + username + ") (" + ClientIp + ")>" + Command); pw.println ("257 /" "+ pdir +" / "est le répertoire actuel"); pw.flush (); } else {pw.println (login_warning); pw.flush (); logger.info ("(" + nom d'utilisateur + ") (" + clientP + ")>" + login_warning); }} // end pwd // commande cwd else if (command.touppercase (). startSwith ("cwd")) {logger.info ("(" + username + ") (" + clientrip + ")>" + command); if (loginstus) {str = command.substring (3) .trim (); if ("". equals (str)) {pw.println ("250 Client cassé détecté, argument manquant à cwd. /" "+ pdir +" / "est le répertoire actuel."); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientIp + ")> 250 Client cassé détecté, argument manquant à CWD. /" + PDIR + "/" est le répertoire actuel. ");} else {// juger si le répertoire a une chaîne tmpDir = dir +" / "+ str; file file = new File (tmpDir); = Dir + "/" Str; répertoire "); pw.flush (); Logger.info ("(" + username + ") (" + clientIp + ")> 250 CWD réussi. /" + pdir + "/" est le répertoire actuel ");} else {// Le répertoire n'existe pas pw.println (" 550 cwd a échoué. / "" + pdir + "/": répertoire non trouvé. "); PW.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientP + ")> 550 cwd a échoué. /" + pdir + "/": répertoire introuvable. "); }} else {pw.println (login_warning); pw.flush (); logger.info ("(" + nom d'utilisateur + ") (" + clientP + ")>" + login_warning); }} // end CWD // QUIT COMMANDE ELSE IF (Command.ToupperCase (). StartSwith ("QUIT")) {Logger.info ("(" + Username + ") (" + ClientIp + ")>" + Command); b = false; pw.println ("221 au revoir"); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientP + ")> 221 Au revoir"); essayez {thread.currentThread (); Thread.Sleep (1000); } catch (InterruptedException e) {logger.Error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); }}} // end quitt / * * transfert Paramètre Commande * / // Commande de port, transmet activement les données en mode else if (Command.toupperCase (). startSwith ("port")) {logger.info ("(" + username + ") (" + clientP + ")>" + Command); 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 (",", "."); try {// instanciate socket tempSocket en mode actif = new socket (retr_ip, port_high * 256 + port_low); // logger.info ("utilisateur" + clientp + ":" + nom d'utilisateur + "Exécuter la commande de port"); pw.println ("200 ports de port réussi"); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + ClientIp + ")> 200 Port Commande réussie"); } catch (ConnectException CE) {pw.println ("425 Impossible d'ouvrir la connexion de données."); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientP + ")> 425 Impossible d'ouvrir la connexion de données."); Logger.Error (ce.getMessage ()); for (stackTraceElement Ste: ce.getStackTrace ()) {logger.Error (Ste.ToString ()); }} catch (UnknownHostException e) {Logger.Error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); }} catch (ioException e) {Logger.Error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); }}} catch (NumberFormatexception e) {pw.println ("503 Bad Sequence of Commands."); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientp + ")> 503 Bad Sequence of Commands."); Logger.Error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("(" + nom d'utilisateur + ") (" + clientP + ")>" + login_warning); }} // End Port // Commande pasv, Mode passive Transfert Data else if (Command.ToupperCase (). StartWith ("Pasv")) {logger.info ("(" + username + ") (" + clientP + ")>" + Command); if (loginStuts) {serversocket ss = null; while (true) {// Obtenez le serveur libre de port libre_high = 1 + générateur.Nextint (20); port_low = 100 + générateur.Nextint (1000); try {// server de liaison des ports ss = new serversocket (port_high * 256 + port_low); casser; } catch (ioException e) {continue; }} // logger.info ("user" + clientIp + ":" + username + "Exécuter la commande pasv"); InetAddress i = null; essayez {i = inetAddress.getLocalHost (); } catch (UnknownHostException e1) {e1.printStackTrace (); } pw.println ("227 Entrée en mode passif (" + i.gethostAddress (). Remplace (".", ",") + "," + port_high + "," + port_low + ")"); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientp + ")> 227 Entrée en mode passif (" + i.gethostaddress (). Remplace (".", ",") + "," + port_high + "," + port_low + ")"); essayez {// socket tempsocket en mode passif = ss.accept (); ss.close (); } catch (ioException e) {logger.Error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("(" + nom d'utilisateur + ") (" + clientP + ")>" + login_warning); }} // End Pasv // Retr Command else if (Command.ToupperCase (). StartWith ("RetT")) {logger.info ("(" + username + ") (" + clientrip + ")>" + commande); if (loginStuts) {str = command.substring (4) .trim (); if ("". equals (str)) {pw.println ("501 Erreur de syntaxe"); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientP + ")> 501 Erreur de syntaxe"); } else {try {pw.println ("150 canal de données d'ouverture pour le transfert de fichiers."); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientP + ")> 150 canal de données d'ouverture pour le transfert de fichiers."); RandomAccessFile OutFile = NULL; OutputStream OutSocket = NULL; Essayez {// Créez un flux de fichiers d'accès aléatoire à partir de et écrivez (facultatif), avec le nom spécifié outfile = new RandomAccessFile (dir + "/" + str, "r"); outocket = tempSocket.getOutputStream (); } catch (filenotfoundException e) {logger.Error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); }} catch (ioException e) {Logger.Error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); }} octet bytebuffer [] = nouveau octet [1024]; longueur int; essayez {while ((longueur = outfile.read (byteBuffer))! = -1) {extérieur.Write (byteBuffer, 0, longueur); } outocket.close (); outfile.close (); TempSocket.Close (); TempSocket.Close (); } catch (ioException e) {logger.Error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); }} // logger.info ("user" + clientIp + ":" + username + "EXECUTE RETR COMMAND"); pw.println ("226 transfert ok"); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientp + ")> 226 transfert ok"); } catch (exception e) {PW.println ("503 Bad Sequence of Commands."); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientp + ")> 503 Bad Sequence of Commands."); Logger.Error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("(" + nom d'utilisateur + ") (" + clientP + ")>" + login_warning); }} // end RetT // Stor Command else if (command.toupperase (). startSwith ("stor")) {logger.info ("(" + nom d'utilisateur + ") (" + clientp + ")>" + commande); if (loginStuts) {str = command.substring (4) .trim (); if ("". equals (str)) {pw.println ("501 Erreur de syntaxe"); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientP + ")> 501 Erreur de syntaxe"); } else {try {pw.println ("150 canal de données d'ouverture pour le transfert de fichiers."); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientP + ")> 150 canal de données d'ouverture pour le transfert de fichiers."); RandomAccessFile Infile = null; InputStream Insocket = null; essayez {infile = new randomaccessfile (dir + "/" + str, "rw"); INSOCKET = TEMPSOCK.GetInputStream (); } catch (filenotfoundException e) {logger.Error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); }} catch (ioException e) {Logger.Error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); }} octet bytebuffer [] = nouveau octet [1024]; longueur int; try {while ((longueur = insicket.read (byteBuffer))! = -1) {infile.write (byteBuffer, 0, longueur); } insicket.close (); infile.close (); TempSocket.Close (); } catch (ioException e) {logger.Error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); }} // logger.info ("user" + clientIp + ":" + username + "Execute Stor Commande"); pw.println ("226 transfert ok"); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientp + ")> 226 transfert ok"); } catch (exception e) {PW.println ("503 Bad Sequence of Commands."); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientp + ")> 503 Bad Sequence of Commands."); Logger.Error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); }}}} else {pw.println (login_warning); pw.flush (); logger.info ("(" + nom d'utilisateur + ") (" + clientP + ")>" + login_warning); }} // end Stor // Commande nlst else if (Command.toupperCase (). startSwith ("nlst")) {logger.info ("(" + username + ") (" + clientrip + ")>" + Command); if (loginStuts) {try {pw.println ("150 canal de données d'ouverture pour la liste des répertoires."); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientP + ")> 150 canal de données d'ouverture pour la liste des répertoires."); Printwriter pwr = null; essayez {pwr = new printwriter (tempsocket.getOutputStream (), true); } catch (ioException e1) {e1.printStackTrace (); } Fichier fichier = nouveau fichier (dir); String [] distructure = new String [10]; distructure = file.list (); for (int i = 0; i <dirstructure.length; i ++) {pwr.println (dirstructure [i]); } essayez {tempsocket.close (); pwr.close (); } catch (ioException e) {logger.Error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); }} // logger.info ("user" + clientIp + ":" + username + "Exécuter la commande nlst"); pw.println ("226 transfert ok"); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientp + ")> 226 transfert ok"); } catch (exception e) {PW.println ("503 Bad Sequence of Commands."); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientp + ")> 503 Bad Sequence of Commands."); Logger.Error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("(" + nom d'utilisateur + ") (" + clientP + ")>" + login_warning); }} // end nlst // list Command else if (Command.toupperCase (). startSwith ("list")) {logger.info ("(" + username + ") (" + clientrip + ")>" + commande); if (loginStuts) {try {pw.println ("150 canal de données d'ouverture pour la liste des répertoires."); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientP + ")> 150 canal de données d'ouverture pour la liste des répertoires."); Printwriter pwr = null; essayez {pwr = new printwriter (tempsocket.getOutputStream (), true); } catch (ioException e) {logger.Error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); }} Ftputil.getdetailList (pwr, dir); essayez {tempsocket.close (); pwr.close (); } catch (ioException e) {logger.Error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); }} // logger.info ("user" + clientIp + ":" + username + "Execute list Commande"); pw.println ("226 transfert ok"); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientp + ")> 226 transfert ok"); } catch (exception e) {PW.println ("503 Bad Sequence of Commands."); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientp + ")> 503 Bad Sequence of Commands."); Logger.Error (e.getMessage ()); for (stackTraceElement Ste: e.getStackTrace ()) {logger.Error (Ste.ToString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("(" + nom d'utilisateur + ") (" + clientP + ")>" + login_warning); }} // end List // Entrez la commande illégale else {logger.info ("(" + nom d'utilisateur + ") (" + clientp + ")>" + commande); PW.println ("500 Erreur de syntaxe, commande non reconnue."); pw.flush (); Logger.info ("(" + nom d'utilisateur + ") (" + clientP + ")> 500 Erreur de syntaxe, commande non reconnue."); }} // terminer pendant que essayez {logger.info ("(" ("+ nom d'utilisateur +") ("+ clientp +")> déconnecté. "); // logger.info (" user "+ clientrip +": "+ username +" eXit "); br.close (); schepchent.close); pw.close (); TempSocket.Close ();}} Catch (ioException e) {Logger. Java.util.date; Dir.ListFiles (); String ModifyDate; pw.println ("drwxr-xr-x ftp ftp 0" + modifyDate + "" + files [i] .getName ());} else {pw.println ("- rw-rr-- 1 ftp ftp" + files pw.flush ();} pw.println ("total:" + files.length);}} ## log4j.appender.stout.layout = org.apache.log4j.patternlayout log4j.appendender.stdout.layout.conversionPattern =% d {absolu}% 5p% c {1}:% l -% m% n ## sort Log4j.apprender.d = org.apache.log4j.daillilingfila log4j.appender.d.file = c: /logs/logs.log log4j.appender.d.append = true ## output log4j.appender.d.sthold = debug log4j.appender.d.layout = org.apache.log4j.patternlayout {yyyymmmmmmmmmmmmmmmmmmmmm HH: mm: ss} [% t:% r] - [% p]% m% n ### Enregistrer les informations d'exception à un fichier séparé ### log4j.appendender.e = org.apache.log4j.dailyrollingfileAppender ## Nom du fichier de journal d'exception log4j.appender Au-dessus du niveau d'erreur !!!Le contenu ci-dessus est la connaissance pertinente sur la mise en œuvre Java de FTP Server Fonction Exemple Code qui vous est présenté par l'éditeur. J'espère que vous l'aimez.