Академический Документы
Профессиональный Документы
Культура Документы
1. Objetivos
En esta prctica se usar Java para introducir conceptos bsicos de comunicacin
sncrona en programas distribuidos, en concreto los objetivos de esta prctica son:
Implementacin de la comunicacin entre un cliente y servidor basndose en el
protocolo TCP en Java. Manejar el API y la documentacin de Java para encontrar la
informacin
necesaria. El entorno de desarrollo a utilizar ser JDK
2. Contenidos
En esta seccin se presenta el problema objeto de esta prctica y se establecen los
ejercicios a realizar. La prctica consta de tres ejercicios. Para la realizacin del
segundo ejercicio es necesario haber comprendido y probado el primer ejercicio.
3. Entrega de la prctica
La prctica se realizar de forma individual. Cuando se finalice se debe entregar un
fichero comprimido prctica 5 miNIP.tar (donde miNIP es el NIP del autor de los
ejercicios) con el siguiente contenido:
1. Un fichero de texto denominado autor.txt que contendr el NIP, los apellidos y el
nombre del autor de la prctica en las primeras lneas del fichero. Por ejemplo:
NIP Apellidos Nombre
-----------------------------------------------------345689 Rodrguez Quintela Sabela
.
3. Un fichero de texto para cada uno de los ejercicios incluidos en la prctica que
contendr una explicacin del comportamiento de los procesos que se crean, de las
comunicaciones que se establecen entre ellos en cada ejercicio, de los resultados
esperados, de los resultados obtenidos,
de las ventajas e inconvenientes de cada una de las soluciones, de los posibles
problemas que puedan surgir, etc. Cada uno de estos ficheros de texto deber
denominarse anlisis X Y.txt (donde X Y indica el nmero de ejercicio) y contendr el
anlisis correspondiente al ejercicio X.Y Los ficheros de texto que deben estar
presentes son: anlisis 5 1.txt, anlisis 5 2.txt y anlisis 5 3.txt.
4. Un fichero ejecutable (shell script) para cada uno de los ejercicios incluidos en la
prctica. Cada uno de estos ficheros deber denominarse compila ej X Y.sh (donde X Y
indica el nmero de ejercicio) y contendr las instrucciones necesarias para compilar
todos los ficheros fuentes Java
(ficheros con extensin .java) correspondientes al ejercicio X.Y Los ficheros ejecutables
que deben estar presentes son: compila ej5 1.sh, compila ej5 2.sh y compila ej 5 3.sh.
5. Un directorio bin, que contendr las libreras necesarias para la ejecucin de la
prctica (en caso de emplear alguna librera no estndar) y los ficheros compilados
correspondientes a los ficheros fuente del directorio src, es decir, en este directorio es
donde depositan las clases compiladas
generadas por los ejecutables compilaX Y.sh.
6. Un fichero ejecutable (shell script) para cada uno de los ejercicios incluidos en la
prctica. Cada uno de estos ficheros deber denominarse ejecuta ejX Y.sh (donde X Y
indica el nmero de ejercicio) y contendr las instrucciones necesarias para lanzar la
ejecucin de la aplicacin diseada en el ejercicio X.Y. Estos ficheros (shell scripts)
deben recibir los argumentos/parmetros necesarios para la ejecucin de las
aplicaciones y definir el CLASSPATH necesario (se deben referenciar los directorios
propios con un path relativo) utilizando la opcin de compilacin -cp o -classpath de
javac. Los ficheros ejecutables que deben estar presentes son: ejecuta ej5 1.sh, ejecuta
ej5 2.sh y ejecuta ej5 3.sh. Al descomprimir el fichero .tar se deben extraer los ficheros y
directorios indicados en el directorio practica 5 miNIP (donde miNIP es el NIP del autor de
la prctica). Es importante seguir las convenciones de nombrado y la estructura de
ficheros y directorios (src, bin, etc.) descrita.
Para la entrega del fichero .tar, se utilizar el programa someter en la mquina hendrixssh.cps.unizar.es. La prctica deber estar sometida antes del inicio de la siguiente
sesin de prcticas del grupo correspondiente.
Anexo I: La clase
Servidor
/*
* File : Servidor . java
* Author :
* Date
* Coms : Programacin de Sistemas Concurrentes y
* Distribuidos Curso 2014 -2015.
* Ejemplo de servidor con comunicacin por sockets
*/
// package practica5 . ejercicio1 ;
import java .io. IOException ;
import java .net . Socket ;
import java .net . ServerSocket ;
import java .io. PrintWriter ;
import java .io. BufferedReader ;
import java .io. InputStreamReader ;
public class Servidor {
public static void main ( String [] args ) {
int SERVER_PORT = 2000;
// El servidor escuchara en local
// en el puerto SERVER_PORT (>= 1024)
ServerSocket serverSocket = null ; // para escuchar
Socket clientSocket = null ; // uno por cliente
// Inicializar el socket del cliente con el que se va
// a comunicar el servidor , es decir se acepta la
// conexin de un cliente al servidor mediante
// el mtodo accept ()
serverSocket = creaListenSocket ( SERVER_PORT );
// En este ejemplo , solo uno . En un caso general
// un servidor tendra esto en un bucle , creando
// uno por cada nuevo cliente
clientSocket = creaClientSocket ( serverSocket );
// Inicializar los canales de comunicacin usados en
// el socket para comunicarse con el cliente .
// El OutputStream permite enviar mensajes al cliente
// El InputStream permite recibir al servidor
// mensajes emitidos por el proceso cliente
PrintWriter salHaciaCliente = null ;
BufferedReader entDesdeCliente = null ;
try{
salHaciaCliente = new PrintWriter (
clientSocket . getOutputStream (), true );
entDesdeCliente = new BufferedReader (
new InputStreamReader (
clientSocket . getInputStream ()
)
);
} catch ( IOException e) {
Cliente
/*
* File : Cliente . java
* Author :
* Coms : Programacin de Sistemas Concurrentes y
* Distribuidos Curso 2014 -2015.
);
canalEntradaDelServidor = new BufferedReader (
new InputStreamReader (
socketAlServidor . getInputStream ()
)
);
} catch ( IOException e) { // abortar si hay problemas
System .err . println ("I/O problem :" + SERVER_ADDRESS );
System . exit (1);
}
// Definicin de un buffer de entrada para leer
// de la entrada standard .
BufferedReader entradaStandard = new BufferedReader (
new InputStreamReader ( System .in ));
String userInput = "";
// Protocolo de comunicacin con el Servidor .
// Mientras no se reciba la secuencia
// " END OF SERVICE "el servidor contara el nmero
// de vocales que aparecen en las frases que le
// enva el cliente . El cliente obtiene las frases
// que le pasa al servidordel usuario que lo
// est ejecutando .
try{
while (!( userInput . equals ("END OF SERVICE "))) {
System . out . print (" Text : ");
userInput = entradaStandard . readLine ();
if ( userInput != null ) {
canalSalidaAlServidor . println ( userInput );
String respuesta = canalEntradaDelServidor
. readLine ();
if ( respuesta != null ) {
System . out . println (" Server answer : "
+ respuesta );
} else {
System . out . println (" Comm . is closed !");
}
} else {
System .err . println (" Wrong input !");
}
}
// Al cerrar cualquiera de los canales de
// comunicacin usados por un socket , el socket
// se cierra . Como no nos importa perder informacin
// cerramos el canal de entrada .
canalEntradaDelServidor . close ();
// Cierre del Socket para comunicarse con el servidor .
socketAlServidor . close ();
} catch ( Exception e){
System .err . println (e);
}
}
static private boolean conectarServidor (int maxIntentos ){
// hasta maxIntentos intentos de conexin , para
// darle tiempo al servidor a arrancar
boolean exito = false ; // hay servidor ?
int van = 0;
while (( van < maxIntentos ) && ! exito ){
try {
socketAlServidor = new Socket (
SERVER_ADDRESS , SERVER_PORT );
exito = true ;
} catch ( Exception e) {
van ++;
System . err . println (" Failures :" + van );
try { // esperar 1 seg
Thread . sleep (1000);
} catch ( InterruptedException e2) {
e2. printStackTrace ();
}
}
}
return exito ;
}
}