FTP (protocolo de transferência de transferência de arquivos Protocolo de transferência de arquivos) é um protocolo usado para transferir arquivos na Internet. Os arquivos podem ser carregados (carregados) ou baixados (download) através do servidor FTP na Internet. O FTP é um serviço on-line em tempo real. Antes de usá -lo, ele deve ser um usuário (nome de usuário e senha) com o serviço. Ao trabalhar, o cliente deve primeiro fazer login no computador que é o servidor. Após o login, o usuário pode executar a pesquisa e a transferência de arquivos e outras operações relacionadas, como alterar o diretório de trabalho atual, o diretório de arquivos da coluna, definir parâmetros de transmissão e transferir arquivos etc. Use FTP para transferir todos os tipos de arquivos, como arquivos de texto, arquivos executáveis binários, arquivos de imagem, arquivos de som e arquivos de compressão de dados.
Comandos FTP
As principais operações do FTP são baseadas em vários comandos. Comandos comumente usados são:
Define o modo de transmissão, que inclui o modo binário ascⅱ (texto) e binário;
Operação de diretório, alterando ou exibindo o diretório atual do computador remoto (comando cd, dir/ls);
Operação de conexão, o comando aberto é usado para estabelecer uma conexão com um computador remoto; O comando de fechamento é usado para fechar a conexão;
Enviar operação, o comando put é usado para transferir arquivos para um computador remoto; O comando put é usado para transferir vários arquivos para um computador remoto;
Obter operação, Get Command é usado para receber um arquivo; O comando mgget é usado para receber vários arquivos.
importar java.net.socket; importar org.apache.log4j.logger; /** * Função - servidor A * @author leon * */public class Servera {public static void main (string [] args) {final string f_dir = "c:/teste"; // caminho da raiz final int porta = 22; // Ouça o número da porta Logger.GeROOTLogger (); Logger logger = logger.getLogger ("com"); tente {serverSocket s = new ServerSocket (porta); logger.info ("conectando ao servidor A ..."); Logger.info ("Connected bem -sucedido! Porta local:"+s.getLocalport ()+". Diretório padrão: '"+f_dir+"'."); while (true) {// Aceite o Soquete de Solicitação do Cliente = S.Cept (); // Crie um thread de serviço new clientThread (cliente, f_dir) .start (); }} catch (Exceção e) {Logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); }}}} importar java.io.bufferedReader; importar java.io.file; importar java.io.filenotfoundException; importar java.io.ioException; importar java.io.inputStream; importar java.io.inputStreamReader; importar java.io.OutputStream; importar java.io.printwriter; importar java.io.randomaccessfile; importar java.net.connectException; importar java.net.inetaddress; importar java.net.serversocket; importar java.net.socket; importar java.net.unknownhostException; importar java.nio.charset.charset; importar java.util.random; importar org.apache.log4j.logger; /** * Classe de subdrehreth do cliente * @Author Leon * */public class ClientThread estende o thread {Socketclient; // Socoque de cliente Logger privado Logger; // Login Objeto Private String dir; // Path absoluto String privado) PDIR = "/"; // PACTER REMOLGADO PRILATIVO STÁTICO Randomator = novo aleatório (); // this.dir = f_dir; } @Override public void run () {Logger.getRootLogger (); logger = logger.getLogger ("com"); InputStream é = nulo; OutputStream OS = NULL; tente {is = socketclient.getInputStream (); OS = SocketClient.getOutputStream (); } catch (ioexception e) {logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); }} Bufferreader Br = new BufferReader (new InputStreamReader (IS, Charset.ForName ("UTF-8"))); PrintWriter PW = new PrintWriter (OS); String clientip = soketClient.getineTAddress (). Tostring (). Substring (1); // grava o cliente ip string userName = "não conectado"; // nome de usuário string senha = ""; // senha string string) String str = ""; // Command Content String int port_high = 0; int port_low = 0; String ret_ip = ""; // o endereço IP do soquete do arquivo de recebimento tempsocket = null; // imprima a mensagem de boas-vindas PW.println ("Servidor de 220-FTP A versão 1.0 escrito por Leon Guo"); pw.flush (); logger.info ("("+nome de usuário+") ("+clientip+")> conectado, enviando mensagem de boas -vindas ..."); logger.info ("("+nome de usuário+") ("+clientip+")> servidor de 220-ftp a versão 1.0 escrito por leon guo"); booleano b = true; while (b) {try {// obtenha o comando inserido pelo comando do usuário = br.readline (); if (null == comando) quebra; } catch (ioexception e) {pw.println ("331 falhou ao obter comando"); pw.flush (); Logger.info ("("+nome de usuário+") ("+clientip+")> 331 falhou ao obter comando"); logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); } b = false; } /** Comando de controle de acesso* / // comando do usuário if (command.touppercase (). StartSwith ("user")) {logger.info ("(não logado) ("+clientip+")>"+comando); nome de usuário = command.substring (4) .Trim (); if ("". Equals (nome de usuário)) {pw.println ("erro 501 de sintaxe"); pw.flush (); logger.info ("(não conectado) ("+clientip+")> 501 erro de sintaxe"); nome de usuário = "não conectado"; } else {pw.println ("331 senha necessária para" + nome de usuário); pw.flush (); Logger.info ("(não conectado) ("+clientip+")> 331 senha necessária para"+nome de usuário); } logInstus = false; } // Usuário final // Passe o comando else if (command.TOUPPERCASE (). STARTSWITH ("PASS")) {LOGGER.Info ("(não conectado) ("+clientip+")>"+comando); senha = command.substring (4) .Trim (); if (nome de usuário.equals ("root") && senha.equals ("root")) {pw.println ("230 conectado"); pw.flush (); Logger.info ("("+nome de usuário+") ("+clientip+")> 230 conectado"); // Logger.info ("Client"+Clientip+"" Login do usuário "); logInstus = true;} else {pw.println (" 530 login ou senha incorreto! "); pame.flush (); Logger.Info (" não logado em) ("+clientip+")> 530 Login ou senha "ou incorporado! Pass // comando pwd else if (command.ToupPercase (). StartSwith ("PWD")) {Logger.info ("("+nome de usuário+") ("+clientip+")>" comando); pw.println ("257 /" "PDIR+" /"é o diretório atual"); } else {pw.println (login_warning); pw.flush (); logger.info ("("+nome de usuário+") ("+clientip+")>"+login_warning); }} // encerrar pwd // comando cwd else if (command.TOUPPERCASE (). startSwith ("cwd")) {logger.info ("("+nome de usuário+") ("+clientip+")>"+comando); if (logInstus) {str = command.substring (3) .Trim (); if ("". Equals (str)) {pw.println ("250 cliente quebrado detectado, faltando argumento para cwd. /" ""+pdir+" /" é um diretório atual. "); pw.flush (); logger.info ("("+nome de usuário+") ("+clientip+")> 250 cliente quebrado detectado, ausente argumento para cwd./"+pdir+"/" é um diretório atual. = Dir+"/" Str; diretório atual "); pw.flush (); Logger.info ("("+nome de usuário+") ("+clientip+")> 250 cwd bem -sucedido./"+pdir+"/" é diretório atual ");} else {// o diretório não existe PW.println (" 550 cwd falhou./""+pdir+"/": ". logger.info ("("+nome de usuário+") ("+clientip+")> 550 cwd falhou. /"+pdir+" /": diretório não encontrado. "); }} else {pw.println (login_warning); pw.flush (); logger.info ("("+nome de usuário+") ("+clientip+")>"+login_warning); }} // encerrar cwd // comando elimine else if (command.TOUPPERCASE (). StartSwith ("Quit")) {Logger.info ("("+nome de usuário+") ("+clientip+")>"+comando); b = false; pw.println ("221 adeus"); pw.flush (); logger.info ("("+nome de usuário+") ("+clientip+")> 221 adeus"); tente {thread.currentThread (); Thread.sleep (1000); } catch (interruptedException e) {Logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); }}} // End Quit /** Transferir comando do parâmetro* /// Porta Comando, transmita ativamente dados no modo else if (command.TOUPPERCASE (). StartSwith ("porta")) {Logger.info ("("+nome de usuário+") ("+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)); String str1 = str.substring (0, str.substring (0, str.LastIndexOf (",")). LastIndexOf (",")); ret_ip = str1.replace (",", "."); tente {// instanciar o tempo do soquete no modo ativo = new Socket (ret_ip, port_high * 256 + port_low); // logger.info ("user"+clientip+":"+nome de usuário+"comando de porta executada"); pw.println ("200 port comando bem -sucedido"); pw.flush (); Logger.info ("("+nome de usuário+") ("+clientip+")> 200 port comando bem -sucedido"); } catch (ConnectException CE) {pw.println ("425 não pode abrir a conexão de dados."); pw.flush (); Logger.info ("("+nome de usuário+") ("+clientip+")> 425 não pode abrir a conexão de dados."); Logger.error (Ce.getMessage ()); para (StackTraceElement Ste: Ce.getStackTrace ()) {Logger.error (ste.toString ()); }} catch (desconhecidoHosTexception e) {Logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); }} catch (ioexception e) {logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); }}} catch (númeroFormatexception e) {pw.println ("503 Bad Sequence of Commands."); pw.flush (); Logger.info ("("+nome de usuário+") ("+clientip+")> 503 Sequência de comandos ruins."); logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+nome de usuário+") ("+clientip+")>"+login_warning); }} // Comando da porta final // PASV, modo passivo Transferir dados else if (command.TOUPPERCASE (). StartSwith ("Pasv")) {Logger.info ("("+nome de usuário+") ("+clientip+")>"+comando); if (logInstuts) {serverSocket ss = null; while (true) {// obtenha o servidor port port_high = 1 + generator.nextint (20); port_low = 100 + gerador.nextInt (1000); tente {// portas de ligação ao servidor ss = new ServerSocket (port_high * 256 + port_low); quebrar; } catch (ioexception e) {continuação; }} // logger.info ("user"+clientip+":"+nome de usuário+"execute o comando pasv"); Inetaddress i = null; tente {i = inetaddress.getLocAlHost (); } catch (desconhecidohostException e1) {e1.printStackTrace (); } pw.println ("227 entrando no modo passivo ("+i.gethostAddress (). substituir (".", "")+","+port_high+","+port_low+")"); pw.flush (); Logger.info ("("+nome de usuário+") ("+clientip+")> 227 entrando no modo passivo ("+i.gethostaddress (). substituir (".", ")+", "+port_high+", "+port_low+") "); tente {// tempsocket de soquete no modo passivo = ss.accept (); ss.close (); } catch (ioexception e) {logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+nome de usuário+") ("+clientip+")>"+login_warning); }} // End Pasv // Ret comando else if (command.touppercase (). startSwith ("ret")) {logger.info ("("+nome de usuário+") ("+clientip+")>"+comando); if (logInstuts) {str = command.substring (4) .Trim (); if ("". Equals (str)) {pw.println ("erro de sintaxe 501"); pw.flush (); logger.info ("("+nome de usuário+") ("+clientip+")> 501 erro de sintaxe"); } else {try {pw.println ("150 Channel de dados de abertura para transferência de arquivo."); pw.flush (); Logger.info ("("+nome de usuário+") ("+clientip+")> 150 Channel de dados de abertura para transferência de arquivo."); RandomAccessFile Outfile = NULL; OUTPUTSTEAM ORBERTUÇÃO = NULL; tente {// crie um fluxo de arquivo de acesso aleatório e grave (opcional), com o nome especificado outfile = new RandomAccessFile (dir+"/"+str, "r"); Orbock = tempsocket.getOutputStream (); } catch (filenotfoundException e) {Logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); }} catch (ioexception e) {logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); }} byte byteBuffer [] = novo byte [1024]; comprimento int; tente {while ((length = outfile.read (bytebuffer))! } orgock.close (); outfile.close (); tempsocket.close (); tempsocket.close (); } catch (ioexception e) {logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); }} // logger.info ("user"+clientip+":"+nome de usuário+"execute retratar comando"); pw.println ("226 transferência ok"); pw.flush (); Logger.info ("("+nome de usuário+") ("+clientip+")> 226 transferência ok"); } catch (Exceção e) {pw.println ("503 Sequência de comandos ruins."); pw.flush (); Logger.info ("("+nome de usuário+") ("+clientip+")> 503 Sequência de comandos ruins."); logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+nome de usuário+") ("+clientip+")>"+login_warning); }} // END RET // STOR Command else if (command.touppercase (). startSwith ("stor")) {logger.info ("("+nome de usuário+") ("+clientip+")>"+comando); if (logInstuts) {str = command.substring (4) .Trim (); if ("". Equals (str)) {pw.println ("erro de sintaxe 501"); pw.flush (); logger.info ("("+nome de usuário+") ("+clientip+")> 501 erro de sintaxe"); } else {try {pw.println ("150 Channel de dados de abertura para transferência de arquivo."); pw.flush (); Logger.info ("("+nome de usuário+") ("+clientip+")> 150 Channel de dados de abertura para transferência de arquivo."); RandomAccessFile Infile = NULL; InputStream Insocock = null; tente {infile = new RandomAccessFile (dir+"/"+str, "rw"); Insocoque = tempsocket.getInputStream (); } catch (filenotfoundException e) {Logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); }} catch (ioexception e) {logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); }} byte byteBuffer [] = novo byte [1024]; comprimento int; tente {while ((length = insocket.read (bytebuffer))! = -1) {infile.write (bytebuffer, 0, comprimento); } insocket.close (); infile.close (); tempsocket.close (); } catch (ioexception e) {logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); }} // logger.info ("user"+clientip+":"+nome de usuário+"execute stor stor"); pw.println ("226 transferência ok"); pw.flush (); Logger.info ("("+nome de usuário+") ("+clientip+")> 226 transferência ok"); } catch (Exceção e) {pw.println ("503 Sequência de comandos ruins."); pw.flush (); Logger.info ("("+nome de usuário+") ("+clientip+")> 503 Sequência de comandos ruins."); logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); }}}} else {pw.println (login_warning); pw.flush (); logger.info ("("+nome de usuário+") ("+clientip+")>"+login_warning); }} // end stor // comando nlst else if (command.TOUPPERCASE (). startSwith ("nlst")) {Logger.info ("("+nome de usuário+") ("+clientip+")>"+comando); if (logInstuts) {try {pw.println ("150 OBRANDO DA LISTA DE DADOS PARA DIRETORY."); pw.flush (); Logger.info ("("+nome de usuário+") ("+clientip+")> 150 Channel de dados de abertura para lista de diretórios."); PrintWriter pwr = null; tente {pwr = new printWriter (tempsocket.getOutputStream (), true); } catch (ioexception e1) {e1.printStackTrace (); } Arquivo de arquivo = novo arquivo (dir); String [] distrutura = new String [10]; distrutura = file.list (); for (int i = 0; i <dirstructure.length; i ++) {pwr.println (dirtructure [i]); } tente {tempsocket.close (); pwr.close (); } catch (ioexception e) {logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); }} // logger.info ("user"+clientip+":"+nome de usuário+"execute nlst comando"); pw.println ("226 transferência ok"); pw.flush (); Logger.info ("("+nome de usuário+") ("+clientip+")> 226 transferência ok"); } catch (Exceção e) {pw.println ("503 Sequência de comandos ruins."); pw.flush (); Logger.info ("("+nome de usuário+") ("+clientip+")> 503 Sequência de comandos ruins."); logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+nome de usuário+") ("+clientip+")>"+login_warning); }} // encerrar nlst // listar comando else if (command.TOUPPERCASE (). startSwith ("list")) {logger.info ("("+nome de usuário+") ("+clientip+")>"+comando); if (logInstuts) {try {pw.println ("150 OBRANDO DA LISTA DE DADOS PARA DIRETORY."); pw.flush (); Logger.info ("("+nome de usuário+") ("+clientip+")> 150 Channel de dados de abertura para lista de diretórios."); PrintWriter pwr = null; tente {pwr = new printWriter (tempsocket.getOutputStream (), true); } catch (ioexception e) {logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); }} Ftputil.getDetaillist (pwr, dir); tente {tempsocket.close (); pwr.close (); } catch (ioexception e) {logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); }} // Logger.info ("Usuário"+Clientip+":"+Nome de usuário+"Execute List Command"); pw.println ("226 transferência ok"); pw.flush (); Logger.info ("("+nome de usuário+") ("+clientip+")> 226 transferência ok"); } catch (Exceção e) {pw.println ("503 Sequência de comandos ruins."); pw.flush (); Logger.info ("("+nome de usuário+") ("+clientip+")> 503 Sequência de comandos ruins."); logger.error (e.getMessage ()); para (StackTraceElement Ste: E.GetStackTrace ()) {Logger.error (ste.toString ()); }}} else {pw.println (login_warning); pw.flush (); logger.info ("("+nome de usuário+") ("+clientip+")>"+login_warning); }} // Lista final // Digite o comando ilegal else {Logger.info ("("+nome de usuário+") ("+clientip+")>"+comando); pw.println ("Erro de sintaxe de 500, comando não reconhecido."); pw.flush (); logger.info ("("+nome de usuário+") ("+clientip+")> 500 erro de sintaxe, comando não reconhecido."); }} // termina enquanto tente {Logger.info ("(" ("+nome de usuário+") ("+clientip+")> desconectado. "); // logger.info (" user "+clientip+": "+nome de usuário+" exit "); B.Close (); SocketClient.Close (); tempsocket.close (); Java.Text.SimpledArtEmat; diretório./r/n ");} arquivos [] arquivos = DIR.ListFiles (); String modifyDate; para (int i = 0; i <files.length; i ++) {modifyDate = new SimpleDateFormat (" yyyy/mm/dd hh: mm: ss "). (arquivos [i] .isdirectory ()) {pw.println ("drwxr-xr-x ftp ftp 0" + modifyDate + "" + arquivos [i] .getName ()); arquivos [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 -L- log4j.appender.d = org.apache.log4j.dailyrollingFileAppender log4j.appender.d.file = c: /logs/logs.log log4j.appender.d.append = true ## saída log4j.appender.d.threshold = denunci.l.apnder.d.layout. log4j.appender.d.layout.conversionPattern = %-d {yyyy-mm-dd hh: mm: ss} [ %t: %r]-[ %p] %m %n ### #log4J.Dail.Dailyr ### Log4j.Append.E = Org.Apache.Log4.Dail.Dail.DailyM log4j.appender.e.file = c: /logs/errors.log log4j.appender.e.append = true ## somente os logs acima do nível de erro !!! Log4j.appender.e.threshold = error4j.appender.e.layout = org.apache.Log4J.PatterNAPLAG4J. %-d {yyyy-mm-dd hh: mm: ss} [ %t: %r]-[ %p] %m %nO conteúdo acima é o conhecimento relevante sobre a implementação do Java do código de função do servidor FTP introduzido pelo editor. Espero que gostem.