-
10.2.4.3 Ejemplo 3: Desarrollo de protocolos de capa de aplicación de red
Tsinghua University Press "Programadores Java, cosas que hacer en el trabajo" autor: Zhong Sheng - Extractos parciales del Capítulo 10 "Un maestro es tan talentoso como capaz".
Es posible que todos hayan utilizado herramientas de carga y descarga FTP. Por ejemplo, "LeapFTP" es una herramienta de carga y descarga de servidor FTP muy conveniente, como se muestra en la figura. Esta herramienta es muy conveniente. Después de ingresar el nombre de usuario y la contraseña, puede ver la lista de archivos en el servidor FTP, lo que facilita las operaciones de carga y descarga.
¿Alguna vez ha intentado escribir una aplicación de carga y descarga de archivos FTP en Java?
Java también puede desarrollar un programa de este tipo. No es complicado. Veamos primero cómo desarrollar una aplicación FTP utilizando el kit de herramientas FTP de Java.
importar sun.net.*;
importar sun.net.ftp.*;
FTP de clase pública {
público estático vacío principal (String [] argumentos) {
String server="192.168.0.12"; //Ingrese la dirección IP del servidor FTP
String user="useway" //Nombre de usuario para iniciar sesión en el servidor FTP
String contraseña=" !@#$%abce " //Contraseña del nombre de usuario para iniciar sesión en el servidor FTP
String path="/home/useway"; //La ruta en el servidor FTP
intentar {
FtpClient ftpClient=new FtpClient(); //Crear objeto FtpClient
ftpClient.openServer(servidor); //Conectarse al servidor FTP
ftpClient.login(usuario, contraseña); //Inicie sesión en el servidor FTP;
if (ruta.longitud()!=0) ftpClient.cd(ruta);
TelnetInputStream es=ftpClient.list();
intc;
mientras ((c=es.read())!=-1) {
System.out.print((char)c);
}
es.close();
ftpClient.closeServer();//Salir del servidor FTP
}
captura (excepción ex) {
}
}
}
Si está interesado, puede escribir este programa usted mismo. Cuando se ejecute este programa, veremos la situación como se muestra en la figura, enumerando el contenido del directorio del programa del lado del servidor.
Este programa es un programa simple para obtener la lista de archivos en el servidor FTP, pero no me malinterpreten, ¡este programa no puede considerarse el desarrollo de un programa de "Protocolo de capa de aplicación de red"!
Este programa solo utiliza las clases relacionadas en "sun.net.*;" y "sun.net.ftp.*;" para operar el lado FTP. No utilizamos el socket de Java a nivel de red para enfrentar el servidor FTP. La solicitud se envía al cliente, pero se envía una solicitud de enlace al servidor a través del kit de herramientas proporcionado por Java.
La ventaja de utilizar el paquete FTP de Java para conectarnos al servidor FTP es que no necesitamos preocuparnos por los detalles específicos del envío de datos a nivel de red, solo debemos llamar al método correspondiente. La desventaja de utilizar el paquete FTP de Java para conectarse al servidor FTP es que los desarrolladores no conocen los entresijos del envío y recepción del protocolo de la capa de aplicación, no pueden comprender los principios y tienen una comprensión muy débil de los datos subyacentes.
En este punto, algunos programadores preguntarán: "Entonces, ¿cómo interactúa FTP entre la PC y el servidor a nivel de red?" Bueno, permítame enumerarle el proceso de interacción del protocolo FTP.
Mire el siguiente ejemplo de interacción del protocolo FTP:
Servidores FTP: 220 (frente a FTPd 2.0.1)
Cliente FTP: modo de uso USUARIO
Servidor FTP: 331 Especifique la contraseña.
Cliente FTP: PASS !@#$%abce
Servidor FTP: 230 Inicio de sesión exitoso.
Cliente FTP: CWD /home/useway
Servidor FTP: 250 Directorio cambiado exitosamente.
Cliente FTP: EPSV TODO
Servidor FTP: 200 EPSV TODO bien.
Cliente FTP: EPSV
Servidor FTP: 229 Ingresando al modo pasivo extendido (|||62501|)
Cliente FTP: LISTA
Servidor FTP: 150 Aquí viene el listado del directorio.
Servidor FTP: 226 Envío de directorio OK.
Cliente FTP: SALIR
Servidor FTP: 221 Adiós.
El texto anterior es en realidad el proceso de interacción entre el servidor FTP y el cliente FTP. El protocolo para transmitir información entre ellos es el protocolo TCP, y el contenido que se envían entre sí es lo que está escrito en el texto anterior.
Expliquemos paso a paso el significado de cada frase:
Servidor FTP: 220 (vsFTPd 2.0.1) | Descripción: Enlace exitoso
Cliente FTP: USER useway |Instrucciones: Ingrese el nombre de usuario
Servidor FTP: 331 Especifique la contraseña | Descripción: Introduzca la contraseña.
Cliente FTP: PASS !@#$%abce |Instrucciones: Ingrese la contraseña
Servidor FTP: 230 Inicio de sesión exitoso | Descripción: Inicio de sesión exitoso.
Cliente FTP: CWD /home/useway Descripción: Cambiar directorio
Servidor FTP: 250 Directorio cambiado exitosamente | Descripción: El cambio de directorio fue exitoso.
Cliente FTP: EPSV ALL | Descripción: modo de enlace pasivo EPSV
Servidor FTP: 200 EPSV TODO ok. Descripción: OK.
Cliente FTP: EPSV | Descripción: Enlace
Servidor FTP: 229 Ingresando al modo pasivo extendido (|||62501|) |Descripción: El puerto de enlace pasivo es 62501
Cliente FTP: LIST | Descripción: Ejecute LIST para mostrar la lista de archivos
Servidor FTP: 150 Aquí viene el listado del directorio | Descripción: La lista se envía desde el puerto 62501.
Servidor FTP: 226 Envío de directorio OK | Descripción: Envío completado.
Cliente FTP: SALIR | Descripción: Salir de FTP
Servidor FTP: 221 Adiós | Descripción: Adiós.
Con el contenido del texto anterior, podemos obtener la lista de archivos FTP sin necesidad de herramientas. Si no lo crees, sígueme y hazlo de nuevo.
Paso 1: Primero abra CMD para ingresar al modo de línea de comando de DOS y escriba:
telnet 192.168.0.1 21[Entrar]
Descripción: Telnet al puerto 21 del servidor Ftp.
Después de ejecutar este comando, los resultados obtenidos son los que se muestran en la figura.
¿Has encontrado algún problema?
El contenido del mensaje es exactamente la primera oración del párrafo anterior: 220 (vsFTPd 2.0.1), lo que significa que el servidor FTP aceptó nuestro enlace y puede continuar con el siguiente paso.
Paso 2: Escriba la siguiente serie de contenidos de envío uno por uno:
Vía de uso USUARIO[Entrar]
PASA !@#$%abce [Entrar]
CWD /home/useway[Entrar]
EPSV TODO[Entrar]
EPSV[Entrar]
Los resultados obtenidos se muestran en la figura.
Bueno, esta vez el servidor FTP dio una serie de respuestas y finalmente dio un nuevo número de puerto "58143".
Paso 3: abre una nueva ventana de CMD y escribe:
telnet 192.168.0.1 58143[Entrar]
Tenga en cuenta que el número de puerto de la solicitud Telnet para conectarse al servidor esta vez es "58143", que es un puerto de enlace que nos proporcionó el servidor FTP. Después de la vinculación, la ventana queda en blanco sin ningún mensaje, como se muestra en la figura.
Paso 4: Regrese a la primera ventana de CMD y escriba:
LISTA[Entrar]
Paso 5: En este momento, la segunda ventana CMD recibe la lista de archivos:
La segunda ventana recibe la lista de archivos como se muestra en la figura.
Paso 6: Salga de la operación
SALIR[Entrar]
Una vez completada la ejecución, el enlace al host se pierde, como se muestra en la figura.
Como puede ver, el protocolo FTP es un proceso interactivo. También puede completar estas operaciones de comando básicas de FTP utilizando la herramienta Telnet que viene con el sistema. Si desea utilizar el Socket de Java para completar la operación anterior, solo necesita seguir el contenido anterior paso a paso para enviar la cadena al servidor FTP.
También damos un código de ejemplo a continuación:
importar java.io.InputStream;
importar java.io.OutputStream;
importar java.net.Socket;
Cliente FTP de clase pública{
public static void main (String [] args) lanza una excepción {
Zócalo zócalo = nuevo zócalo ("192.168.0.1", 21);
InputStream es = socket.getInputStream();
Sistema operativo OutputStream = socket.getOutputStream();
//Recibir información del enlace inicial
byte[] buffer = nuevo byte[100];
int longitud = is.read(buffer);
Cadena s = nueva cadena (búfer, 0, longitud);
System.out.println(s);
//Enviar nombre de usuario
String str = "vía de uso USUARIOn";
os.write(str.getBytes());
//Obtener el valor de retorno
longitud = is.read(búfer);
s = nueva cadena (búfer, 0, longitud);
System.out.println(s);
//Enviar contraseña
str = "PASE !@#$%abcdn ";
os.write(str.getBytes());
//Obtener el valor de retorno
longitud = is.read(búfer);
s = nueva cadena (búfer, 0, longitud);
System.out.println(s);
//Enviar comando de cambio de carpeta
str = "CWD /home/usewayn";
os.write(str.getBytes());
//Obtener el valor de retorno
longitud = is.read(búfer);
s = nueva cadena (búfer, 0, longitud);
System.out.println(s);
//Establecer modo
cadena = "EPSV TODOSn";
os.write(str.getBytes());
//Obtener el valor de retorno
longitud = is.read(búfer);
s = nueva cadena (búfer, 0, longitud);
System.out.println(s);
//Obtener información de monitoreo pasivo
cadena = "EPSVn";
os.write(str.getBytes());
//Obtener el valor de retorno
longitud = is.read(búfer);
s = nueva cadena (búfer, 0, longitud);
System.out.println(s);
//Obtener el número de puerto para monitoreo pasivo FTP
Lista de puertos de cadena=s.substring(s.indexOf("(|||")+4,s.indexOf("|)"));
System.out.println(lista de puertos);
// Crea una instancia de la clase de subproceso ShowList y vincula el número de puerto de escucha pasiva FTP
MostrarLista sl=nueva MostrarLista();
sl.port=Integer.parseInt(lista de puertos);
sl.start();
//Ejecutar comando LISTA
cadena = "LISTAn";
os.write(str.getBytes());
//Obtener el valor de retorno
longitud = is.read(búfer);
s = nueva cadena (búfer, 0, longitud);
System.out.println(s);
//Cierra el enlace
es.close();
os.cerrar();
socket.cerrar();
}
}
//Obtiene la clase de información de enlace pasivo, esta clase es multiproceso
clase ShowList extiende Thread{
puerto int público = 0;
ejecución pública vacía(){
intentar{
Socket socket = new Socket("192.168.0.1",este.puerto);
InputStream es = socket.getInputStream();
Sistema operativo OutputStream = socket.getOutputStream();
byte[] buffer = nuevo byte[10000];
int longitud = is.read(buffer);
Cadena s = nueva cadena (búfer, 0, longitud);
System.out.println(s);
//Cierra el enlace
es.close();
os.cerrar();
socket.cerrar();
}
captura (excepción ex) {
}
}
}
El resultado de ejecución obtenido después de ejecutar el programa es como se muestra en la figura. Es básicamente el mismo que el efecto de ejecución anterior. ¿Qué pasa con la capa inferior? No es más que desempaquetar los métodos encapsulados y ejecutarlos. las reglas de su funcionamiento, podemos desarrollar el mismo programa.