-
10.2.4.3 Exemplo 3: Desenvolvimento de protocolos da camada de aplicação de rede
Tsinghua University Press "Programadores Java, coisas para fazer no trabalho" autor: Zhong Sheng - Trechos parciais do Capítulo 10 "Um mestre é tão talentoso quanto capaz".
Todos podem ter usado ferramentas de upload e download de FTP. Por exemplo, "LeapFTP" é uma ferramenta de upload e download de servidor FTP muito conveniente, conforme mostrado na figura. Esta ferramenta é muito prática. Após inserir o nome de usuário e a senha, você poderá visualizar a lista de arquivos no servidor FTP, o que facilita as operações de upload e download.
Você já tentou escrever um aplicativo de upload e download de arquivos FTP em Java?
Java também pode desenvolver tal programa. Vejamos primeiro como desenvolver um aplicativo FTP usando o kit de ferramentas FTP do Java.
importar sun.net.*;
importar sun.net.ftp.*;
classe pública FTP {
public static void main(String[] args) {
String server="192.168.0.12"; //Insira o endereço IP do servidor FTP
String user="useway"; //Nome de usuário para efetuar login no servidor FTP
String password=" !@#$%abce " //Senha do nome de usuário para efetuar login no servidor FTP
String path="/home/useway"; //O caminho no servidor FTP
tentar {
FtpClient ftpClient=new FtpClient(); //Cria objeto FtpClient
ftpClient.openServer(servidor); //Conecta ao servidor FTP
ftpClient.login(usuário, senha); //Faça login no servidor FTP
if (caminho.length()!=0) ftpClient.cd(caminho);
TelnetInputStream is=ftpClient.list();
interno c;
enquanto ((c=is.read())!=-1) {
System.out.print((char)c);
}
é.close();
ftpClient.closeServer();//Sai do servidor FTP
}
catch(Exceção ex){
}
}
}
Se estiver interessado, você mesmo pode escrever este programa. Quando este programa for executado, veremos a situação mostrada na figura, listando o conteúdo do diretório do programa do lado do servidor.
Este programa é um programa simples para obter a lista de arquivos no servidor FTP, mas não me interpretem mal, este programa não pode ser chamado de desenvolvimento de um programa "Network Application Layer Protocol"!
Este programa usa apenas as classes relacionadas em "sun.net.*;" e "sun.net.ftp.*;" para operar o lado FTP. Não usamos o Socket do Java no nível da rede para enfrentar o servidor FTP. a solicitação é enviada ao cliente, mas uma solicitação de link é enviada ao servidor por meio do kit de ferramentas fornecido pelo Java.
A vantagem de usar o pacote FTP do Java para conectar-se ao servidor FTP é que não precisamos nos preocupar com os detalhes específicos do envio de dados no nível da rede, mas apenas chamar o método correspondente. A desvantagem de usar o pacote FTP do Java para se conectar ao servidor FTP é que os desenvolvedores não conhecem os meandros do envio e recebimento do protocolo da camada de aplicativo, não conseguem entender os princípios e têm uma compreensão muito fraca dos dados subjacentes.
Neste ponto, alguns programadores perguntarão: “Então, como o FTP interage entre o PC e o servidor no nível da rede?” Bem, deixe-me listar o processo de interação do protocolo FTP para você.
Observe o seguinte exemplo de interação do protocolo FTP:
Servidores FTP: 220 (vsFTPd 2.0.1)
Cliente FTP: modo de uso do USUÁRIO
Servidor FTP: 331 Especifique a senha.
Cliente FTP: PASS !@#$%abce
Servidor FTP: 230 Login bem-sucedido.
Cliente FTP: CWD /home/useway
Servidor FTP: 250 Diretório alterado com sucesso.
Cliente FTP: EPSV ALL
Servidor FTP: 200 EPSV TUDO ok.
Cliente FTP: EPSV
Servidor FTP: 229 Entrando no modo passivo estendido (|||62501|)
Cliente FTP: LISTA
Servidor FTP: 150 Aí vem a listagem de diretórios.
Servidor FTP: 226 Diretório enviado OK.
Cliente FTP: SAIR
Servidor FTP: 221 Adeus.
O texto acima é na verdade o processo de interação entre o servidor FTP e o cliente FTP. O protocolo de transmissão de informações entre eles é o protocolo TCP, e o conteúdo enviado entre si é o que está escrito no texto acima.
Vamos explicar o significado de cada frase passo a passo:
Servidor FTP: 220 (vsFTPd 2.0.1) Descrição: Link bem-sucedido
Cliente FTP: USER useway |Instruções: Digite o nome de usuário
Servidor FTP: 331 Especifique a senha |Descrição: Digite a senha.
Cliente FTP: PASS !@#$%abce |Instruções: Digite a senha
Servidor FTP: 230 Login bem-sucedido |
Cliente FTP: CWD /home/useway Descrição: Alternar diretório
Servidor FTP: 250 Diretório alterado com sucesso |Descrição: A troca de diretório foi bem-sucedida.
Cliente FTP: EPSV ALL Descrição: modo de link passivo EPSV
Servidor FTP: 200 EPSV TUDO ok |
Cliente FTP: EPSV Descrição: Link
Servidor FTP: 229 Entrando no Modo Passivo Estendido (|||62501|) |Descrição: A porta do link passivo é 62501
Cliente FTP: LIST Descrição: Execute LIST para exibir a lista de arquivos
Servidor FTP: 150 Aí vem a listagem de diretórios |
Servidor FTP: 226 Envio de diretório OK |Descrição: Envio concluído.
Cliente FTP: QUIT Descrição: Sair do FTP
Servidor FTP: 221 Adeus |
Com o conteúdo do texto acima, podemos obter a lista de arquivos FTP sem nenhuma ferramenta. Se você não acredita, siga-me e faça novamente.
Passo 1: Primeiro abra o CMD para entrar no modo de linha de comando do DOS e digite:
telnet 192.168.0.1 21[Entrar]
Descrição: Telnet para a porta 21 do servidor FTP.
Após executar este comando, os resultados obtidos são os mostrados na figura.
Você encontrou algum problema?
O conteúdo do prompt é exatamente a primeira frase do parágrafo acima: 220 (vsFTPd 2.0.1), o que significa que o servidor FTP aceitou nosso link e pode prosseguir para a próxima etapa.
Passo 2: Digite a seguinte série de envio de conteúdo, um por um:
Modo de uso do USUÁRIO[Enter]
PASSE !@#$%abce [Enter]
CWD /home/useway[Enter]
EPSV TODOS[Entrar]
EPSV[Entrar]
Os resultados obtidos são mostrados na figura.
Bem, desta vez o servidor FTP deu uma série de respostas e finalmente deu um novo número de porta “58143”.
Etapa 3: Abra uma nova janela CMD e digite:
telnet 192.168.0.1 58143[Entrar]
Observe que o número da porta da solicitação Telnet para conectar-se ao servidor desta vez é "58143", que é uma porta de link fornecida pelo servidor FTP. Após a vinculação, a janela fica em branco sem nenhum aviso, conforme mostrado na figura.
Passo 4: Retorne à primeira janela do CMD e digite:
LISTA[Entrar]
Passo 5: Neste momento, a segunda janela do CMD recebe a lista de arquivos:
A segunda janela recebe a lista de arquivos conforme mostrado na figura.
Passo 6: Saia da operação
SAIR[Entrar]
Após a conclusão da execução, o link com o host é perdido, conforme mostrado na figura.
Como você pode ver, o protocolo FTP é um processo interativo. Você também pode concluir essas operações básicas de comando do FTP usando a ferramenta Telnet que acompanha o sistema. Se você quiser usar o Socket do Java para concluir a operação acima, você só precisa seguir passo a passo o conteúdo acima para enviar a string ao servidor FTP.
Também damos um exemplo de código abaixo:
importar java.io.InputStream;
importar java.io.OutputStream;
importar java.net.Socket;
classe pública FTPClient{
public static void main(String[] args) lança exceção{
Soquete soquete = novo Soquete("192.168.0.1",21);
InputStream é = socket.getInputStream();
OutputStream os = socket.getOutputStream();
//Recebe informações iniciais do link
byte[] buffer = novo byte[100];
comprimento interno = is.read(buffer);
String s = new String(buffer, 0, comprimento);
System.out.println(s);
//Envia nome de usuário
String str = "caminho de uso do USUÁRIOn";
os.write(str.getBytes());
//Obtém o valor de retorno
comprimento = is.read(buffer);
s = nova String(buffer, 0, comprimento);
System.out.println(s);
//Envia senha
str = "PASS !@#$%abcdn ";
os.write(str.getBytes());
//Obtém o valor de retorno
comprimento = is.read(buffer);
s = nova String(buffer, 0, comprimento);
System.out.println(s);
//Envia comando de troca de pasta
str = "CWD /home/usewayn";
os.write(str.getBytes());
//Obtém o valor de retorno
comprimento = is.read(buffer);
s = nova String(buffer, 0, comprimento);
System.out.println(s);
//Definir modo
str = "EPSV TODOSn";
os.write(str.getBytes());
//Obtém o valor de retorno
comprimento = is.read(buffer);
s = nova String(buffer, 0, comprimento);
System.out.println(s);
//Obter informações de monitoramento passivo
str = "EPSVn";
os.write(str.getBytes());
//Obtém o valor de retorno
comprimento = is.read(buffer);
s = nova String(buffer, 0, comprimento);
System.out.println(s);
//Obtém o número da porta para monitoramento passivo de FTP
String listaport=s.substring(s.indexOf("(|||")+4,s.indexOf("|)"));
System.out.println(lista de portas);
//Instancia a classe de thread ShowList e vincula o número da porta de escuta passiva do FTP
ListaDeExibição sl=new ListaDeExibição();
sl.port=Integer.parseInt(lista de portas);
sl.start();
//Executa o comando LIST
str = "LISTAn";
os.write(str.getBytes());
//Obtém o valor de retorno
comprimento = is.read(buffer);
s = nova String(buffer, 0, comprimento);
System.out.println(s);
//fecha o link
é.close();
os.close();
soquete.close();
}
}
//Obtém a classe de informações do link passivo, esta classe é multithread
classe ShowList estende Thread{
porta interna pública = 0;
execução nula pública(){
tentar{
Soquete soquete = new Soquete("192.168.0.1",this.port);
InputStream é = socket.getInputStream();
OutputStream os = socket.getOutputStream();
byte[] buffer = novo byte[10000];
comprimento interno = is.read(buffer);
String s = new String(buffer, 0, comprimento);
System.out.println(s);
//fecha o link
é.close();
os.close();
soquete.close();
}
catch(Exceção ex){
}
}
}
O resultado de execução obtido após a execução do programa é mostrado na figura. É basicamente o mesmo que o efeito de execução acima. E quanto à camada inferior, nada mais é do que descompactar os métodos encapsulados e executá-los. as regras de seu funcionamento, podemos O mesmo programa pode ser desenvolvido.