FTP (Protocolo de transferencia de archivos de protocolo de transferencia de archivos) es un protocolo utilizado para transferir archivos en Internet. Los archivos se pueden cargar (cargar) o descargar (descargar) a través del servidor FTP en Internet. FTP es un servicio en línea en tiempo real. Antes de usarlo, debe ser un usuario (nombre de usuario y contraseña) con el servicio. Al trabajar, el cliente primero debe iniciar sesión en la computadora que es el servidor. Después de iniciar sesión, el usuario puede realizar la búsqueda de archivos y la transferencia de archivos y otras operaciones relacionadas, como cambiar el directorio de trabajo actual, el directorio de archivos de columna, configurar los parámetros de transmisión y transferir archivos, etc. Use FTP para transferir todos los tipos de archivos, como archivos de texto, archivos ejecutables binarios, archivos de imagen, archivos de sonido y archivos de compresión de datos.
Comandos FTP
Las principales operaciones de FTP se basan en varios comandos. Los comandos de uso común son:
Establece el modo de transmisión, que incluye ASCⅱ (texto) y modo binario binario;
Operación del directorio, cambio o visualización del directorio actual de la computadora remota (comando CD, Dir/LS);
Operación de conexión, el comando Open se utiliza para establecer una conexión con una computadora remota; El comando Cerrar se usa para cerrar la conexión;
Operación de envío, el comando PUT se usa para transferir archivos a una computadora remota; El comando PUT se usa para transferir múltiples archivos a una computadora remota;
Obtener operación, Get Command se usa para recibir un archivo; El comando mgget se usa para recibir múltiples archivos.
import java.net.socket; importar org.apache.log4j.logger; /** * rol - servidor a * @author leon * */public class ServerA {public static void main (string [] args) {String final f_dir = "c:/test"; // root ruta final int port = 22; // Escuchar el número de puerto logger.getRootLogger (); Logger logger = logger.getLogger ("com"); intente {Serversocket s = nuevo Serversocket (puerto); logger.info ("conectarse al servidor a ..."); logger.info ("Connected Success! while (true) {// Aceptar solicitud de cliente Socket Client = s.accept (); // crear un hilo de servicio nuevo ClientThread (Client, F_DIR) .Start (); }} capt (excepción e) {logger.error (e.getMessage ()); for (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.ToString ()); }}}} import java.io.bufferedReader; import java.io.file; import java.io.filenotfoundException; import java.io.ioException; import java.io.inputstream; import java.io.inputstreamreader; import java.io.outputstream; import java.io.printwriter; import java.io.randomaccessfile; import java.net.connectException; import java.net.inetaddress; import java.net.serversocket; import java.net.socket; import java.net.unknownHosTexception; import java.nio.charset.charset; import java.util.random; importar org.apache.log4j.logger; /** * Cliente Subthread Clase * @author leon * */public class ClientThread extiende Thread {private Socket Socket SocketClient; // Client Socket Logger Logger; // Objeto de inicio de sesión privado String Dir; // Absolute Rath private String pdir = "/"; // Patía privada Final Private Static Generator = new New (); // Número aleatorio Public ClientThread (Socket Socket Cliente, stock, sports, sports, sports F_Dir) cliente; this.dir = f_dir; } @Override public void run () {logger.getRootLogger (); logger = logger.getLogger ("com"); InputStream es = nulo; OutputStream OS = NULL; prueba {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); // Recibir Cliente IP String String UserName = "No registrado"; // UserName String String Password = ""; // String String Command = ""; // Comando Boolean LoginStus = False;/El estado de inicio de sesión Final String Login_Warning = "530 Por favor, por favor, log y pase el usuario de loginstus = false; // Cadena str = ""; // Comando Contenido String int Port_high = 0; int port_low = 0; Cadena retr_ip = ""; // La dirección IP del archivo de recepción de archivo tempsocket = null; // Imprima el mensaje de bienvenida pw.println ("servidor de 220 ftp una versión 1.0 escrita por Leon Guo"); pw.flush (); logger.info ("("+nombre de usuario+") ("+clientip+")> conectado, enviando un mensaje de bienvenida ..."); logger.info ("("+username+") ("+clientip+")> 220-ftp servidor una versión 1.0 escrita por leon guo"); booleano b = verdadero; while (b) {try {// Obtener el comando ingresado por el comando user = br.readline (); if (comando null ==) ruptura; } catch (ioException e) {pw.println ("331 no se pudo obtener el comando"); pw.flush (); logger.info ("("+nombre de usuario+") ("+clientip+")> 331 no se pudo obtener el comando"); logger.error (e.getMessage ()); for (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.ToString ()); } b = falso; } /** Comando de control de acceso* / // comando de usuario if (comand.ToUpperCase (). Startswith ("user")) {logger.info ("(no iniciado) ("+clientip+")>"+comando); username = command.substring (4) .trim (); if ("". Equals (UserName)) {pw.println ("Error de sintaxis 501"); pw.flush (); logger.info ("(no registrado) ("+clientip+")> 501 error de sintaxis"); UserName = "No registrado"; } else {pw.println ("331 contraseña requerida para" + nombre de usuario); pw.flush (); logger.info ("(no registrado) ("+clientip+")> 331 contraseña requerida para"+nombre de usuario); } LoginStus = false; } // Usuario final // Pase el comando else if (command.ToUpperperCase (). startswith ("pase")) {logger.info ("(no registrado) ("+clientip+")>"+comando); contraseña = command.substring (4) .trim (); if (username.equals ("root") && contraseña.equals ("root")) {pw.println ("230 registrado"); pw.flush (); logger.info ("("+nombre de usuario+") ("+clientip+")> 230 registrado"); // logger.info ("Client"+Clientip+"" Login de usuario "); loginstus = true;} else {pw.println (" 530 Login o contraseña incorrecta! "); pw.flush (); logger.info (" (no registrado) ("+clientip+")> 530 login o contraseña! "); usue =" no logged) ("+clientip+")> 530 login o contraseña! "); User. // end pass // pwd command else if (command.ToUpperCase (). startswith ("pwd")) {logger.info ("("+username+") ("+clientip+")>"+comando); pw.println ("257 /" "+pdir+" /"es el directorio actual"); } else {pw.println (login_warning); pw.flush (); logger.info ("("+username+") ("+clientip+")>"+login_warning); }} // end pwd // cwd command else if (command.ToUpperperCase (). startswith ("cwd")) {logger.info ("("+username+") ("+clientip+")>"+comando); if (loginstus) {str = command.substring (3) .trim (); if ("". Equals (str)) {pw.println ("250 Cliente roto detectado, faltando argumento a cwd. /" "+pdir+" /"es el directorio actual"); pw.flush (); logger.info ("("+username+") ("+clientip+")> 250 cliente roto detectado, argumento faltante a cwd./"+pdir+"/" es directorio actual. ");} else {// juzga si el directorio tiene cadena tmpdir = dir+"/"+str; file de archivo = new (tmpDir); if (file.Exists () string tmpdir = dir+"/"+archivo de archivo = new (tmpDir); If (file.Exists (). = dir+"/"+str; directorio "); pw.flush (); logger.info ("("+username+") ("+clientip+")> 250 cwd exitoso./"+pdir+"/" es el directorio actual ");} else {// El directorio no existe pw.println (" 550 cwd falló./"+pdir+"/": no encontrado el directorio"); pw.flush (); logger.info ("("+nombre de usuario+") ("+clientip+")> 550 cwd falló. /"+pdir+" /": directorio no encontrado "); }} else {pw.println (login_warning); pw.flush (); logger.info ("("+username+") ("+clientip+")>"+login_warning); }} // end cwd // dejar el comando else if (command.ToUpperCase (). startswith ("quit")) {logger.info ("("+username+") ("+clientip+")>"+comando); b = falso; pw.println ("221 adiós"); pw.flush (); logger.info ("("+nombre de usuario+") ("+clientip+")> 221 adiós"); intente {Thread.CurrentThread (); Thread.sleep (1000); } catch (InterruptedException e) {logger.error (e.getMessage ()); for (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.ToString ()); }}} // end quit /** Comando de parámetro de transferencia* /// comando de puerto, transmitir activamente datos en el modo más if (comandante.toUpperperCase (). startswith ("puerto")) {logger.info ("("+username+") ("+clientip+")>"+comando); 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)); Cadena str1 = str.substring (0, str.substring (0, str.lastIndexof (",")). LastIndexOf (",")); retr_ip = str1.replace (",", "."); Pruebe {// Instanciar el socket Tempsocket en modo activo = nuevo socket (retr_ip, port_high * 256 + port_low); // logger.info ("user"+clientip+":"+nombre de usuario+"ejecutar puerto comando"); pw.println ("Comando de 200 puertos exitosos"); pw.flush (); logger.info ("("+username+") ("+clientip+")> comando de 200 puertos exitoso"); } Catch (ConnectException CE) {pw.println ("425 no se puede abrir la conexión de datos"); pw.flush (); logger.info ("("+nombre de usuario+") ("+clientip+")> 425 no se puede abrir la conexión de datos"); logger.error (ce.getMessage ()); for (stackTraceElement ste: ce.getStackTrace ()) {logger.error (ste.ToString ()); }} Catch (desconocidoHostException 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 (NumberFormateException e) {pw.println ("503 SECUENCIA MALA DE COMANDOS"); pw.flush (); logger.info ("("+username+") ("+clientip+")> 503 secuencia mala de comandos"); logger.error (e.getMessage ()); for (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.ToString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+username+") ("+clientip+")>"+login_warning); }} // end puerto // comando Pasv, datos de transferencia de modo pasivo más if (command.ToUpperCase (). startswith ("pasv")) {logger.info ("("+username+") ("+clientip+")>"+comando); if (loginstuts) {ServerSocket ss = null; while (true) {// Obtenga el puerto gratuito del servidor Port_high = 1 + Generator.NextInt (20); Port_low = 100 + Generator.NextInt (1000); Pruebe {// puertos de enlace de servidor ss = new ServerSocket (Port_high * 256 + Port_low); romper; } catch (ioException e) {continuar; }} // logger.info ("usuario"+clientip+":"+nombre de usuario+"ejecutar el comando Pasv"); Inetaddress i = null; intente {i = inetaddress.getLocalHost (); } capt (desconocidoHosTexception e1) {e1.printstacktrace (); } pw.println ("227 entrando en modo pasivo ("+i.gethostaddress (). reemplazar (".", ",")+","+port_high+","+port_low+")"); pw.flush (); logger.info ("("+username+") ("+clientip+")> 227 entrando en modo pasivo ("+i.gethostaddress (). reemplazar (".", ")+", "+port_high+", "+port_low+") "); intente {// socket tempsocket en modo pasivo = 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 ("("+username+") ("+clientip+")>"+login_warning); }} // end Pasv // REPR Command Else if (Command.ToUpPerCase (). StartSwith ("Retr")) {logger.info ("("+username+") ("+clientip+")>"+comando); if (loginstuts) {str = command.substring (4) .trim (); if ("". Equals (str)) {pw.println ("Error de sintaxis 501"); pw.flush (); logger.info ("("+nombre de usuario+") ("+clientip+")> 501 error de sintaxis"); } else {try {pw.println ("150 apertura del canal de datos para la transferencia de archivos"); pw.flush (); logger.info ("("+nombre de usuario+") ("+clientip+")> 150 ABRIBRA DEL CANAL DE DATOS para la transferencia de archivos"); RandomAccessFile outFile = null; OutputStream outSocket = nulo; Pruebe {// Cree una transmisión de archivo de acceso aleatorio desde y escriba (opcional), con el nombre especificado OutFile = new RandomAccessFile (dir+"/"+str, "r"); outSocket = 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 ()); }} byte bytebuffer [] = new Byte [1024]; int longitud; Pruebe {while ((longitud = outFile.read (bytebuffer))! = -1) {outSocket.write (byteBuffer, 0, longitud); } outSocket.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+":"+nombre de usuario+"ejecutar rer command"); pw.println ("226 Transfer Ok"); pw.flush (); logger.info ("("+nombre de usuario+") ("+clientip+")> 226 transferir ok"); } catch (excepción e) {pw.println ("503 mala secuencia de comandos"); pw.flush (); logger.info ("("+username+") ("+clientip+")> 503 secuencia mala de comandos"); logger.error (e.getMessage ()); for (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.ToString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+username+") ("+clientip+")>"+login_warning); }} // end retr // stor command else if (command.ToUpperCase (). startswith ("stor")) {logger.info ("("+username+") ("+clientip+")>"+comando); if (loginstuts) {str = command.substring (4) .trim (); if ("". Equals (str)) {pw.println ("Error de sintaxis 501"); pw.flush (); logger.info ("("+nombre de usuario+") ("+clientip+")> 501 error de sintaxis"); } else {try {pw.println ("150 apertura del canal de datos para la transferencia de archivos"); pw.flush (); logger.info ("("+nombre de usuario+") ("+clientip+")> 150 ABRIBRA DEL CANAL DE DATOS para la transferencia de archivos"); RandomAccessfile infile = nulo; InputStream Insocket = NULL; intente {infile = new RandomAccessFile (dir+"/"+str, "rw"); Insocket = tempsocket.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 ()); }} byte bytebuffer [] = new Byte [1024]; int longitud; Pruebe {while ((longitud = insocket.read (bytebuffer))! = -1) {infile.write (bytebuffer, 0, longitud); } Insocket.close (); infile.close (); tempsocket.close (); } catch (ioException e) {logger.error (e.getMessage ()); for (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.ToString ()); }} // logger.info ("usuario"+clientip+":"+nombre de usuario+"ejecutar stor command"); pw.println ("226 Transfer Ok"); pw.flush (); logger.info ("("+nombre de usuario+") ("+clientip+")> 226 transferir ok"); } catch (excepción e) {pw.println ("503 mala secuencia de comandos"); pw.flush (); logger.info ("("+username+") ("+clientip+")> 503 secuencia mala de comandos"); logger.error (e.getMessage ()); for (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.ToString ()); }}}} else {pw.println (login_warning); pw.flush (); logger.info ("("+username+") ("+clientip+")>"+login_warning); }} // end stor // nlst command else if (command.ToUpperCase (). startswith ("nlst")) {logger.info ("("+username+") ("+clientip+")>"+comando); if (loginstuts) {try {pw.println ("150 apertura de canal de datos para la lista de directorio."); pw.flush (); logger.info ("("+UserName+") ("+Clientip+")> 150 Abra el canal de datos para la lista de directorio."); PrintWriter PWR = NULL; intente {pwr = new PrintWriter (tempsocket.getOutputStream (), true); } catch (ioException e1) {e1.printstackTrace (); } Archivo archivo = nuevo archivo (dir); String [] distribuir = nueva cadena [10]; distructura = file.list (); for (int i = 0; i <dirstructure.length; i ++) {pwr.println (dirstructure [i]); } try {tempsocket.close (); pwr.close (); } catch (ioException e) {logger.error (e.getMessage ()); for (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.ToString ()); }} // logger.info ("usuario"+clientip+":"+nombre de usuario+"ejecutar nlst command"); pw.println ("226 Transfer Ok"); pw.flush (); logger.info ("("+nombre de usuario+") ("+clientip+")> 226 transferir ok"); } catch (excepción e) {pw.println ("503 mala secuencia de comandos"); pw.flush (); logger.info ("("+username+") ("+clientip+")> 503 secuencia mala de comandos"); logger.error (e.getMessage ()); for (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.ToString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+username+") ("+clientip+")>"+login_warning); }} // end nlst // list command else if (command.ToUpperCase (). startswith ("list")) {logger.info ("("+username+") ("+clientip+")>"+comando); if (loginstuts) {try {pw.println ("150 apertura de canal de datos para la lista de directorio."); pw.flush (); logger.info ("("+UserName+") ("+Clientip+")> 150 Abra el canal de datos para la lista de directorio."); PrintWriter PWR = NULL; intente {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); intente {tempsocket.close (); pwr.close (); } catch (ioException e) {logger.error (e.getMessage ()); for (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.ToString ()); }} // logger.info ("user"+clientip+":"+nombre de usuario+"ejecutar list command"); pw.println ("226 Transfer Ok"); pw.flush (); logger.info ("("+nombre de usuario+") ("+clientip+")> 226 transferir ok"); } catch (excepción e) {pw.println ("503 mala secuencia de comandos"); pw.flush (); logger.info ("("+username+") ("+clientip+")> 503 secuencia mala de comandos"); logger.error (e.getMessage ()); for (StackTraceElement Ste: E.GetStackTrace ()) {logger.error (ste.ToString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+username+") ("+clientip+")>"+login_warning); }} // End List // Ingrese el comando ilegal else {logger.info ("("+nombre de usuario+") ("+clientip+")>"+comando); pw.println ("Error de sintaxis 500, comando no reconocido"); pw.flush (); logger.info ("("+username+") ("+clientip+")> 500 error de sintaxis, comando no reconocido"); }} // end whip while {logger.info ("(" ("+username+") ("+clientip+")> disconnected. "); // logger.info (" user "+clientip+": "+username+" exit "); b.close (); bocketClient.close (pw.close (); if ((neo exit"); b.close (); SocketClient.close (); pw.close (); if ((neout "); braClose (); TEMPSOKE.CLOSE (); java.text.simpledateformat; directorio./r/n ");} file [] files = dir.listFiles (); string modifyDate; for (int i = 0; i <files.length; i ++) {modifyDate = new SimpleDateFormat (" yyyy/mm/dd hh: mm: ss ") .Format (NEW DELA (NEW DIET [I] .lastModmodmodModified ()));););););); (archivos [i] .IsDirectory ()) {pw.println ("DRWXR-XR-X FTP FTP 0" + ModifyDate + "" + archivos [i] .getName ()); archivos [i] .getName ()); log4j.appender.stdout.toRget = system.out log4j.appender.stdout.layout = org.apache.log4j.patternlayout log4j.appender.stdout.layout.conversionPattern = %d {absoluto} %5p %c {1}: %l - %m %n ## outputin log4j.appender.d = org.apache.log4j.DailyRollingFilePeppender log4j.appender.d.file = c: /Logs/logs.log log4j.appender.d.append = true ## output outy log4j.appender.d.layout.conversionPattern = %-d {yyyyy-mm-dd hh: mm: ss} [ %t: %r]-[ %p] %m %n ### Guarde información de excepción a un archivo separado ### log4j.appender.e = org.apache.log4j.dailyringfileappeppender ## name de archivo de excepción log4j.appender.e.file = c: /logs/errors.log log4j.appender.e.append = true ## Solo los registros de salida por encima del nivel de error! %-d {yyyyy-mm-dd hh: mm: ss} [ %t: %r]-[ %p] %m %nEl contenido anterior es el conocimiento relevante sobre la implementación de Java del código de ejemplo de función del servidor FTP que le presenta el editor. Espero que te guste.