INSTITUTO POLITÉCNICO NACIONAL
ESCUELA SUPERIOR DE CÓMPUTO
PRÁCTICA 5 WGET
APOLONIO VILLEGAS DIEGO ARMANDO
HURTADO OLIVARES JUAN CARLOS
3CM16
AXEL ERNESTO MORENO CERVANTES
APLICACIONES PARA COMUNICACIONES EN RED
26 DE JUNIO DE 2023
Introducción
Wget es una herramienta informática creada por el Proyecto GNU. Puede ser usado para recuperar
contenido y archivos de varios servidores web. El nombre es una combinación de World Wide Web
y la palabra get. Admite descargas a través de FTP, SFTP, HTTP y HTTPS. Para el desarrollo de la
práctica, se desarrollará sobre el protocolo HTTP para descargar recursos de un servidor de manera
recursiva.
Su nombre deriva de World Wide Web (w) y de la palabra obtener (en inglés get). Este nombre
viene a querer decir: obtener desde la WWW.
Hoy en día existen decenas de aplicaciones para descargar archivos de manera muy eficiente. La
mayoría de ellas se basan en interfaces Web y de escritorio, y están desarrolladas para todos los
sistemas operativos. Sin embargo, en Gnu/Linux (también hay versión para Windows) existe el
poderoso gestor de descargas de archivos wget. Está considerado como el downloader más potente
que existe.
HTTP
HTTP, de sus siglas en inglés: "Hypertext Transfer Protocol", es el nombre de un protocolo el cual
nos permite realizar una petición de datos y recursos, como pueden ser documentos HTML. Es la
base de cualquier intercambio de datos en la Web, y un protocolo de estructura cliente-servidor,
esto quiere decir que una petición de datos es iniciada por el elemento que recibirá los datos (el
cliente), normalmente un navegador Web. Así, una página web completa resulta de la unión de
distintos sub-documentos recibidos, como, por ejemplo: un documento que especifique el estilo de
maquetación de la página web (CSS), el texto, las imágenes, vídeos, scripts, etc... . [1]
HTTP es un protocolo basado en el principio de cliente-servidor: las peticiones son enviadas por
una entidad: el agente del usuario (o un proxy a petición de uno). La mayoría de las veces el agente
del usuario (cliente) es un navegador Web, pero podría ser cualquier otro programa, como por
ejemplo un programa-robot, que explore la Web, para adquirir datos de su estructura y contenido
para uso de un buscador de Internet. [1]
Cada petición individual se envía a un servidor, el cuál la gestiona y responde. Entre cada petición y
respuesta, hay varios intermediarios, normalmente denominados proxies (en-US), los cuales
realizan distintas funciones, como: gateways o caches. [1]
Desarrollo
El programa realizado para la práctica fue desarrollado en Java con la versión 17 del JDK. Se
implementó la petición Wget para la descarga de recursos de un servidor mediante el protocolo HTTP
de manera recursiva, ya sea para descargar archivos o directorios, usando además un pool de hilos
para controlar las descargas y que no se descarguen más cosas de las especificadas en el pool.
Clase Wget y constructor
import [Link].*;
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
public class Wget extends Thread {
URL url;
String path;
private final ExecutorService pool;
public Wget(String url, String path, int x) {
pool = [Link](10);
try {
[Link] = new URL(url);
[Link] = path;
if (x == 1) {
process();
} else {
writeData(new File(path + "/" + getName(url)));
}
} catch (Exception e) {
[Link]();
[Link]();
}
[Link]();
}
La primera sección del código corresponde a la declaración de librerías y la descripción de la clase
Wget, la cual contiene los miembros:
▪ URL: Que corresponde a la dirección URL de la página que se desea descargar con todo su
contenido
▪ path: la ruta donde serán descargados los datos obtenidos de la página web
▪ pool: corresponde al pool de hilos que será utilizado para la gestión de descarga de archivos
Además, se encuentra el constructor de la clase Wget donde se inicializan los valores de cada instancia
de la clase. En esta parte se define el uso de 10 hilos en el pool utilizado.
Constructor secundario y método process
public Wget(String url, String path, final ExecutorService pool, int x) {
[Link] = pool;
try {
[Link] = new URL(url);
[Link] = path;
if (x == 1) {
process();
} else {
writeData(new File(path + "/[Link]"));
}
} catch (Exception e) {
[Link]();
}
}
public void process() {
if ([Link]().indexOf(".") == -1) {
isDir();
} else {
writeData(new File(path + getName([Link]())));
}
}
Se tiene un segundo constructor de la clase Wget en la cual se puede pasar como parámetro el objeto
de tipo ExecutorService que es usado para realizar la operación recursiva y no continuar con la
generación de pool de hilos extra. También se define el método process, que es el encargado de hacer
la descarga de archivos, en caso de que sea un directorio el archivo a descargar, se llama a la función
isDir y en caso contrario se efectúa writeData.
Método writeData e isDir
private void writeData(File file) {
try {
[Link]("Descargando el archivo: " +
[Link]());
DataOutputStream dos = new DataOutputStream(new
FileOutputStream(file));
DataInputStream dis = new DataInputStream([Link]());
byte[] b = new byte[65535];
int l = [Link](b);
while (l != -1) {
[Link](b, 0, l);
l = [Link](b);
}
} catch (Exception e) {
[Link]();
}
}
private String getName(String file) {
String[] x = [Link]("/");
return x[[Link] - 1];
}
private void isDir() {
File file = new File(path + getName([Link]()));
if ([Link]()) {
path = [Link]() + "\\";
try {
DataInputStream dis = new
DataInputStream([Link]());
byte[] b = new byte[65535];
int l = [Link](b);
String st = "";
while (l != -1) {
st += new String(b, 0, l);
l = [Link](b);
}
int i = [Link]("PARENTDIR");
if (i == -1) {
[Link](getName("Error" + [Link]()) +
" No se reconoce");
[Link]("Obteniendo bytes.");
[Link](new Wget([Link](), path, pool,
2));
return;
}
i = [Link]("href", i);
[Link](new Wget([Link](), path, pool, 2));
while ((i = [Link]("href", i + 1)) != -1) {
String next = [Link](i + 6, [Link]("\"", i
+ 6));
[Link](new Wget([Link]() + next, path,
pool, 1));
}
} catch (Exception e) {
[Link]();
}
} else {
[Link]("Error: " + [Link]());
}
}
Apolonio Villegas Diego Armando
Hurtado Olivares Juan Carlos
Referencias
[1] Diana, C.. “Qué es y cómo usar el comando WGet”, Hostinger, 01-Dec-2021. [Online].
Available:[Link] [Accessed: 7-Jun-2022]