Sie sind auf Seite 1von 8

1

COMUNICACIN ENTRE SOCKETS, MEDIANTE DIVERSOS


SERVIDORES PARA TRANSFERIR ARCHIVOS.
Christian P. Snchez Juan P. Narvez Ral B. Suquinagua Edgar O. Muoz

(Resumen/Abstract) En este proyecto se crearan mltiples


servidores que tiene la funcin de listar los datos archivados,
adems que tienen la funcin de enviar dichos archivos al cliente,
lo que se demostrara que si es posible realizar la conexin entre
distintos servidores, y mediante un algoritmo que se explicara en la
prctica se mostrara que se comunican mediante el mismo puerto y
direccin IP.

I. OBJETIVOS
A Objetivos generales
1 Verificar el funcionamiento de la comunicacin, mdiate la
utilizacin de sockets en java.
2 Crear la conexin entre distintos servidores que se
comuniquen con un cliente.
3 Conocer la importancia de implementar hilos para
establecer una comunicacin fiable y ms eficiente.
4) Enviar archivos mediante el socket ya sean con extensin
jpg. mp3. txt. Entre otros.
B Objetivos especficos
1 Aprender algoritmo de creacin de base de datos para
almacenar los archivos y tener la opcin de listar dichos
archivos a travs del cliente.
2 Aprender algoritmo de envi de archivos.
3 Aprender algoritmo de recepcin y visualizacin de los
archivos recibidos.
I. INTRODUCCION
Se muestra un diagrama de cmo funciona el sistema, la
secuencia cuando el cliente hace la peticin de un archivo, el
ejemplo que se describe, es cuando el cliente hace la peticin
de un archivo, deber.pdf y el servidor principal no lo tiene
entonces le devuelve al cliente la ubicacin del archivo en otro
servidor, entonces el cliente realiza una conexin con el nuevo
servidor y se da la trasferencia

II. SUSTENTO TEORICO


A. Los InputStream: EL OBJETO System.in
Al igual que Java nos ofrece System.out para escribir en
pantalla, tenemos System.in para leer de ella. System.in es un
objeto de una clase de java que se llama InputStream.
Para java, un InputStream es cualquier cosa de la que se
leen bytes. Puede ser el teclado, un fichero, un socket, o
cualquier otro dispositivo de entrada. Esto, por un lado es una
ventaja. Si todas esas cosas son InputStream, podemos hacer
cdigo que lea de ellas sin saber qu estamos leyendo.
Por otro lado, como un InputStream es para leer bytes, slo
tiene mtodos para leer bytes. Nosotros queremos leer
palabras o nmeros del teclado, no bytes. Si escribimos en el
teclado una A mayscula y la leemos con System.in,
obtendremos un entero de valor 65, que es el valor del byte
correspondiente a la A.
B. Los Reader
Para java, una clase Reader es una clase que lee caracteres.
Esto se parece ms a lo que queremos. Un Reader tiene
mtodos para leer caracteres. Con esta clase ya podramos
trabajar. La pena es que seguimos teniendo System.in, que es
un InputStream y no un Reader.

Cmo convertimos el System.in en Reader?. Hay una clase


en java, la InputStreamReader, que nos hace esta conversin.
Para obtener un Reader, nicamente tenemos que instanciar un
InputStreamReader pasndole en el constructor un
InputStream.

Estamos declarando una variable "isr" de tipo


InputStreamReader. Creamos un objeto de esta clase haciendo
new InputStreamReader(...). Entre parntesis le pasamos el
InputStream que queremos convertir a Reader, en este caso, el
System.in
Cmo funciona exactamente?
1) InputStreamReader es un Reader. Se comporta igual
que in Reader y se puede poner en cualquier sitio que admita
un Reader. Es decir, podemos leer de l caracteres.
2) Al construirla le hemos pasado un InputStream, en
concreto, System.in. InputStreamReader de alguna forma se
lo guarda dentro.
3) Cuando a InputStreamReader le pedimos caracteres, l
le pide al InputStream que tiene guardado dentro los bytes,
los convierte a caracteres y nos los devuelve.
C. La clase BufferedReader
La clase InputStreamReader tiene un ligero problema, es
que nos da los caracteres sueltos. Si estamos leyendo por el
teclado, el que usa el programa puede escribir 10 o 20 o 13 o
n- caracteres. Si usamos InputStreamReader, ya que este lee
caracteres sueltos, Tenemos que decirle cuntos queremos (y
no lo sabemos), o bien ir pidiendo de uno en uno.
Esto es un poco engorroso y si slo tuviramos la clase
InputStreamReader, tendramos que repetir por muchos lados.
Para el caso concreto de leer de teclado, sera ideal si hubiese
una clase en java que nos lea de golpe todo lo que ha escrito el
usuario de nuestro programa.
El mecanismo para obtener un BufferedReader a partir de
otro Reader cualquiera (por ejemplo el InputStreamReader),
es similar al que usamos antes. Lo instanciamos pasndole en
el constructor el Reader.

El funcionamiento de esta clase es igual que el


InputStreamReader. Cuando le damos una lnea completa de
caracteres (un String), esta le pide al Reader que lo tenga
dentro, los convierte en String y nos lo devuelve.
Para pedirle un String, se usa el mtodo readLine(). Este
mtodo lee todos los caracteres tecleados (recibidos si fuera
otro dispositivo de entrada) hasta que encuentra la pulsacin
de la tecla <INTRO> o <RETURN>.

Esto lee del teclado un String completo y lo guarda en una


variable "texto".
D. Navegacin de archivos y I/O en JAVA
1) Clases de I/O
a) File La API dice que la clase File es una
representacin abstracta de rutas de archivo y directorios. La
clase File no es usada actualmente para leer o escribir
informacin, es usada para trabajar en un alto nivel, creando
nuevos archivos vacin, buscar archivos, borrar archivos,
hacer directorios y trabajar con rutas.
b) FileReader Esta clase es usada para leer archivos
de caracteres. Su mtodo read() es usado a bajo nivel,
permitiendo leer caracteres de manera singular, todo el stream
de caracteres, o un nmero fijado de caracteres. Los
FileReaders estn usualmente envueltos en objetos de alto
nivel como BufferedReaders, el cual incrementan el
rendimiento y proveen una manera conveniente de trabajar
con informacin.
c) BufferedReader Esta clase es usada para hacer
clases Reader de bajo nivel como FileReader pero de una
manera ms eficiente y ms fcil de usar. Comparado con los
FileReaders, los BufferedReaders leen relativamente grandes
cantidades de un archivo a la vez, y mantienen esta
informacin en el buffer. Cuando preguntamos por el siguiente
carcter o la siguiente lnea de informacin, es recuperado del
buffer, lo que minimiza el nmero de veces que se tiene que
leer desde el archivo, lo cual es una operacin ms lenta. En
adicin, la clase BufferedReader proveen mtodos ms
convenientes como readLine(), el cual nos permite leer la
siguiente linea de caracteres de un archivo.
d) FileWriter Esta clase es usada para escribir
caracteres en archivos. Su mtodo write() permite escribir
caracteres o strings a un fichero. Esta clase normalmente est
envuelta en objetos Writer de ms alto nivel como
BufferedWriter o PrintWriters, lo cual proveen un mayor
rendimiento y un alto nivel, con mtodos ms flexibles para
escribir informacin.
e) BufferedWriter Esta clase es usada para hacer
clases de bajo nivel como FileWriters de una manera ms
eficiente y ms fciles de usar. Comparado con las clases
FileWriter, los BufferedWriters escribe relativamente grandes
cantidades de informacin a un archivo, lo cual minimiza el
nmero de veces que las operaciones de escritura de archivos
se llevan a cabo, las cuales son operaciones ms lentas. La
clase BufferedWriter tambin provee un mtodo llamado
newLine() el cual crea separadores de linea especficos de la
plataforma de manera automtica.
f) Console Esta clase lleg nueva en Java 6, y provee
de mtodos para leer entradas desde la consola y escribir
salidas formateadas a la consola.
E. Clases para ficheros de texto en java
1) FileReader y FileWriter permiten leer y escribir,
respectivamente, en un fichero.
Primeramente debemos importar estas clases y las que
controlan las excepciones.

Despus debemos crear un objeto de alguna de estas clases.


Se pueden construir con un objeto File, FileDescriptor o un
String. Al crear un objeto de estas clases, deben estar dentro de
un try-catch, con la finalidad de controlar las excepciones
Cuando creamos un objeto, abrimos un stream entre nuestro
programa y el exterior, cuando dejemos de usarlo debemos
cerrar el stream con el mtodo close().

manera tendra que comprar dichos productos como pueden


ser pelculas, libros, videos, msica, etc.
Cabe recalcar que para una gran red de intercambio de
archivos se debe cumplir dos tareas fundamentales que son:
1-Debe existir una manera de transferir archivos digitales
entre un usuario y otros mediante el internet en general
2- Se debe proporcionar un servicio de directorio o de
indexacin que permite a los usuarios buscar en la red para el
contenido y determinar su localizacin de archivos.

a) FileReader el fichero a utilizar debe existir, de lo


contrario se lanzara una excepcion, ademas este mtodo no
tiene parmetros pero devuelve un nmero que si le hacemos
un casting a char este sera legible por nosotros. Esto lo
podemos mostrar por pantalla o incluso pasarlo a otro fichero
(crear otro objeto). Cuando se termina el fichero, el mtodo
read devuelve -1.
b) FileWriter el fichero a utilizar no debe existir, de
lo contrario producira un error, este mtodo puede usar como
parmetro un String con lo que queremos escribir o un nmero
que se corresponder un carcter de la tabla ASCII.
2) PrintWriter permite escribir un fichero de tipo texto.
Primeramente es necesario incluir la librera
import java.io/*:

Se van a estudiar plataformas de intercambio de contenido


de Internet que existen en la actualidad. Como son Napster,
OpenNap, eDonkey, FastTrack, Gnutella, BitTorrent,
Megaupload, Rapidshare y YouTube. Para cada plataforma, se
describir su arquitectura, y se discute sus puntos fuertes y
dbiles desde la perspectiva en general.
1) Napster.
Fue el primer peer-to-peer para realizar intercambios de
archivos. El diseo P2P significa que los archivos fueron
transferidos directamente entre dos ordenadores personales en
vez de ser subidos a, y luego descargado de, servidores de
archivos.
Napster fueron modestos en comparacin con un tradicional
servicio de alojamiento de archivos, ya que todos los archivos
reales se almacenan slo en equipos personales de los
usuarios, no en los servidores de Napster.

Para imprimir un fichero de tipo texto es necesario crear un


objeto de tipo PrintWriter.
PrintWriter file = new printWriter(Nombre_fichero.txt);
Si en nombre del fichero existe, al crear el objeto el
contenido del fichero se borrara.
La clase PrintWriter permite escribir en un fichero con los
metodos print y println.
print escribe un fichero sin saltar la linea.
println escribe un fichero y aade un salto de linea.
Pasos para escribir en un fichero de texto:
a) Abrir el fichero con un obejto de la clase
PrintWriter.
b) Escribir los datos en el fichero utilizando los
metodos print y println.
c) Cerrar el fichero.
F. Resumen archivo Filesharing
Compartir archivos es uno de los usos ms populares de hoy
en da que se puede encontrar en el internet, lo que representa
aproximadamente un 40% de todo el trfico de datos. Lo cual
permite a los usuarios obtener libremente el contenido de otra

Fig. 1. Origen de la arquitectura Napster.

2) Bsqueda descentralizada: OpenNap y eDonkey.


Una versin menos centralizada de Napster, llamado
OpenNap, haba aparecido en el Internet poco despus del
lanzamiento de la red original en 1999.
OpenNap bas en una red del ms pequeo, servidores de
directorios interconectados que fueron operados de manera
independiente como se muestra a continuacin.

Fig. 4. Estrategias.

Hablando de BitTorrent:
Fig. 2. Arquitectura de OpenNap/ eDonkey

El objetivo era que OpenNap deba afrontar los pleitos


mediante la descentralizacin suficiente de sus nodos crticos.
Sin embargo, este enfoque no tuvo xito. Luego de su reciente
victoria contra Napster, la RIAA en 2002 comenz un agresiva
campaa amenazando operadores directorio OpenNap con
demandas de responsabilidad indirecta.

Creado en 2001, y representa otro paso en la evolucion de las


redes de comparticion de archivos.
Primeramente, BitTorrent divide los procesos de descarga en
un gran nmero de conexiones punto a punto sobre los cuales
pequeos fragmento del archivo de descarga son transferidos
desde mltiples fuentes de comparticin.

3) FastTrack y Gnutella
Ambos fueron completamente descentralizados, no
solamente fueron transferencias de archivos peer-to-peer,
tambin lo fue la transferencia hacia todo el directorio.
Gnutella y FastTrack no son organizaciones o servidores,
pero son lenguajes a travs de los cuales las computadoras se
pueden comunicar con otras.
Cuando inicia, los clientes empiezan a buscar en su
vecindario las direccione ip cercanas para conexiones peer.
Una vez que el peer es identificado, su coleccin de archivos
compartidos puede ser buscada.

Fig. 3. La arquitectura Gnutella y FastTrack

Fig. 5. Arquitectura de BitTorrent.

Los ISP pueden ayudar en la aplicacin de los derechos de


autor:
-pueden bloquear el acceso de los suscriptores a
ciertos sitios ofensivos.
-podran potencialmente controlar los datos de sus
suscriptores.
-pueden aplicar una serie de elementos de disuasin
contra los suscriptores que se dedican a violaciones
de derechos de autor. En primera instancia si ocurre
una violacin de derechos de autor por un individual
da lugar a una advertencia por correo electrnico e
inicia el seguimiento de Internet del infractor. La
segunda violacin resulta en un aviso emitido por
correo registrado; el tercero puede resultar en multas
y suspensin de los privilegios de Internet.

En principio, dos estrategas legales contra redes de usuarios


individuales es conveniente. La primera es la demanda de
usuarios para el hecho de compartir contenido con derechos de
autor, y el segundo es la demanda de usuarios parai. Plataformas de alojamiento.
descargarlos.
Plataformas de alojamiento se basan en el modelo clienteservidor
tradicional de net-work A, en lugar del modelo peerHay una razn tecnolgica, al igual que una razn legal,
to-peer.
Es
decir, los usuarios se conectan a un servidor de
para llevar a cabo esto de manera legal.
archivo central al que subir, y de la que se descarga, los
La razn tecnolgica es el hecho de que una descarga es archivos.
difcil de observar.
La razn legal, es el hecho de que una descarga podra ser
observada, el mero hecho de descargar contenidos con
derechos de autor no es en si mismo ilegal

Megaupload
Era un servicio basado e alojamiento de archivos, Hasta su
cierre, Megaupload era un servicio de alojamiento ms

popular, que representa aproximadamente un tercio de


descargas trfico hacia y desde sitios de alojamiento
Los contenidos digitales en sus servidores de archivos que
podran luego ser descargado por cualquier persona que saba
la ubicacin del contenido. Megaupload no public un
directorio de los contenidos que encuentra alojado. En su
lugar, los usuarios ya sea compartieron enlaces de
descarga
directamente entre s.
Fig. 8. Establece tamao inicial de base de datos.

Fig. 6. Arquitectura de Megaupload.

Ahora procedemos a importar la base de datos que contiene


el servidor 1, para esto le enviamos un mensaje lista esto
especifica que nos enve la lista de los archivos que contiene.
Posteriormente aadimos a la lista de nuestro servidor actual
mediante el comando println se puede notar que en el while
est con la sentencia true esto quiere decir que se va a agregar
a la lista al final en lugar de reemplazarlo. Esto se visualiza
tanto en la Fig.9, para el servidor uno y en la Fig.10, para el
servidor2.

YouTube
La arquitectura de youtube tanto el alojamiento de archivos
como funciones de directorio estn totalmente centralizado.
YouTube proactivamente intenta fomentar una comunidad
basada en compartir contenido legal educando a sus usuarios
sobre los derechos de autor y las limitaciones de uso justo al
cargar nuevo contenido.

Fig. 9. Importa base de datos del servidor 1.

Fig. 7. Arquitectura de Youtube

III. DESARROLLO
A) Servidor en lenguaje de programacin de Java
Primeramente definimos cuantos archivos tiene nuestro
servidor actualmente a travs de la bandera1, que se muestra
en la Fig 8.

Fig. 10. Importa base de datos del servidor 1.

En la Fig.11, se procede a crear dos arreglos uno que


almacene las palabras antes del igual y en el otro arreglo las
palabras despus del igual, esto se hace ya que despus vamos
a necesitar saber en qu servidor se encuentra esa palabra.
Cuando ya se ha creado la conexin decimos, si el mensaje
es diferente de 0 proceda a hacer lo siguiente, caso contrario
el hilo muere.

Fig. 13. Enva archivo directamente.


Fig. 11. Separa datos en dos argumentos.

Ahora bien, decimos si el mensaje que envi el cliente es


igual a listar entonces enviamos lnea a lnea la lista de
archivos locales con el mtodo WriteBytes, se aprecia en la
Fig.12.

Fig. 12. Enva datos de archivos locales y remotos.

Pero si el mensaje que envi el cliente es diferente de listar


entonces, se compara si el dato que solicita el cliente en que
servidor est y posteriormente se est en el servidor se enva
directamente el archivo pero si est en el servidor uno este
enva su direccin y puerto socket al cliente para que el cliente
haga la peticin del archivo y as poder enviar el archivo
solicitado al cliente (Fig.13. y Fig.14.).

Fig. 14. Enva direccin y puerto socket.

B) Cliente en lenguaje de programacin de Java


Lo primero que se debe realizar es crear una clase, luego se
crea un flujo de datos ObjectInputStream
que est
especializado en la lectura y escritura de objetos. Luego
procesan
flujos
primitivos
DataInputStream
y
dataOuputStream que nos permite escribir y leer datos en
ficheros binarios como se muestra en la Fig. 15.

Fig. 15. Crear la clase.

Primeramente tenemos un bucle comparando mientras el


cliente no envi un salir el hilo permanece leyendo datos
comparando y enviando los archivos deseados. Cuando
utilizamos el mtodo writeBytes tenemos que enviar el
mensaje con un enter dado que la caracterstica de readLine es
poner en el bufer todo hasta que haiga un enter.

Luego se realiza la comparacion de puertos y si son los mismo


puertos entonces se realiza el traspaso de archivo que fue
pedido, lacual asignamos la direccion de escritorio para que
sea guardado, se coloca un numero de buffer adecuado para
que se logre pasar el archivo con xito. De la misma manera se
realiza para todos los servidores disponibles.

Ademas se ingresa el puerto y la direccion IP del servidor


principal, ya que esa seria una manera de obtener el listado de
archivos que contiene el servidor principal en su base de datos
en general de los demas servidores conectados.
Es pertinente aclarar que el proceso mencionado anteriormente
se lo encerr en un bucle dado que necesitamos dado que se
necesita correr consecutivamente el proceso ya que antes se lo
implemento sin el bucle y cada que se realizaba un peticin se
ejecutaba normalmente el proceso pero cuando enviaba la
respuesta cerraba el socket, es decir, serva para solo una
peticin.
Fig. 18. Trasferencia de archivo.

C) Servidor n en lenguaje java.


Este servidor es muy parecido a los servidores que
hemos elaborado (el servidor de diccionario (.
Se mostrara los segmentos de cdigo y se explicara lo
que hace cada segmento, se mostrara en la secuencia
que trabaja el servidor que es de la siguiente manera:
generar lista, se crea un socket para escuchar, se
conecta con el servidor principal y enva la lista,
recibe la peticin del cliente y trasmite los datos, y
cierra la conexin
1.- generar lista.-esto lo hace al momento de ejecutar,
primero se genera la lista que existe en un archivo.txt,
leemos este archivo y lo guardamos en un arreglo
denominado significado

Fig. 16. Listar contenido del servidor.

A continuacin en la Fig.17, se muestra que si la peticin del


cliente es diferente de listar entonces se obtiene la direccin Ip
y el puerto del servidor que tenga dicho archivo para que se
establezca la conexin, el puerto se debe pasar a entero ya que
se lee como un string, para que se establezca la conexin.

Fig. 17. Comunicacin cliente servidor.

2.-.- se crea un socket de escucha.- esto es de manera


tpica para los servidores, se crea un socket y
permanece escuchando una peticin
3.- conexin con el servidor principal.- mediante un
hilo se realiza la conexin ya que el servidor
principal en cuanto se ejecuta se conecta con el
servidor n, como se explic en la parte A y enva la
peticin de lista, el servidor n toma el arreglo
significado y lo enva en una cadena de bits al

servidor principal, se debe designar al a la variable


significado como variable global. Una vez enviado
todo el arreglo el hilo se muere

4) La trasmisin de archivos se puede dar mediante un


bucle while hasta alcanzar la mxima capacidad del
buffer
5) Esta conexin busca la manera de transferir archivos
de la manera ms ptima.
V. RECOMENDACIONES
1) Tener cuidado al momento de ingresar las palabras ya
que en algunos lenguajes de programacin se envan
las palabras con un enter y eso puede generar errores
al momento de que el servidor enva el mensaje.
2) Implementar los recursos aprendidos en clase para
realizar un programa ms ptimo y que sea muy
eficiente.
3) Asegurarse que la direccin donde se estn
guardando los archivos sea la correcta, caso contrario
se establece la conexin pero no se transfiere
adecuadamente los archivos.
4) Se recomienda asignar el tamao del buffer un
numero grande mltiplo de 2, de esto depende el
mxima capacidad de archivo que se puede trasmitir
5) Especificar el servidor y el nombre del archivo para
generar las listas, esto ayudara a la bsqueda y la
localizacin
6) En el servidor n el hilo que se crea para el envi de la
lista es el nico que no debera morir
7) se debe poner la actualizacin de listas al principio
para no gastar recursos.

4.-recibe la peticin del cliente y trasmite los datos.se conecta y se crea un hilo, si la peticin es distinta
de lista, entonces se crea un buffer (8192), se toma
esta peticin y se la localiza en la direccin que esta
el recurso (para la prctica se coloc todo en el
escritorio), est dado por cierto que ese archivo existe
en el servidor ya que el servidor principal dio ese
dato al cliente. Tomo el archivo y lo trasmite bit a bit
hasta alcanzar los 8192 una vez que alcanza este
nmero se cierra la conexin

VI. BIBLIOGRAFIA
Publicaciones virtuales:
Sitios Web:
IV. CONCLUSIONES
1) Es muy importante que el tiempo de conexin entre
clientes y servidor sea rpido, ya que los archivos a
transferirse pueden ser de diferente tamao.
2) Es ms efectivo trabajar con hilos ya que el servidor
puede hacer varias tareas
3) No es necesario verificar si el archivo existe en la
lista del servidor n, ya que el servidor principal lo
sabe.

Libros o Documentos:
[1]
[2]

http://www.dlsi.ua.es/asignaturas/sid/JSockets.pdf
http://www.nebrija.es/~oruano/java/05%20Gestion%20de%20ficheros
%20de%20texto%20en%20Java.pdf

Das könnte Ihnen auch gefallen