clases sokect
TRANSCRIPT
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 149
Herramientas y Lenguajes de Programacion
Coromoto Leon Hernandez
15 creditos
Universidad de La Laguna
Programa de Doctorado de Fısica e Informatica
Dpto de Estadıstica IO y Computacion2006-2007
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 249
Resumen
El curso ldquoHerramientas y Lenguajes de Programacionrdquo del programa de doctorado deldquoFısica e Informaticardquo esta clasificado como metodologico (optativo) La Figura 1 muestralos distintos itinerarios que se pueden seguir en el programa de doctorado
Figura 1 Itinerarios del Programa de Doctorado
El curso esta dividido en tres partes Este material cubre la parte del curso relacionadacon la manipulacion de herramientas informaticas y el desarrollo de aplicaciones
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 349
Indice general
1 Introduccion 2
11 Desarrollo de aplicaciones Informaticas 212 Herramientas 3121 Proceso de Compilacion 4122 Compilacion de programas formados por varios modulos 5123 Creacion de Librerıas 6124 Documentacion 8
13 Lenguajes de Programacion 11
2 Programas Java Aplicaciones 14
21 Ejemplo de aplicacion 1422 Ejercicios 15
3 Programas Java applets 17
31 Ejemplo de applet 1732 Ejercicios 19
4 Creacion de Threads 20
41 La clase Thread 2042 La interfaz Runnable 2143 Ejercicios 21
5 Sincronizacion de Threads 23
51 Exclusion mutua y secuencializacion 23
52 Ejercicios 24
6 Direcciones IP y Nombres de Dominio 25
61 La clase InetAddress 2562 Ejercicios 26
7 Las clases Java DatagramPacket y DatagramSocket 28
71 Introduccion 2872 La clase DatagramPacket 2973 La clase DatagramSocket 30
1
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 449
Herramientas y Lenguajes de Programacion 06-07 2
74 Ejercicios 31
8 Las clases Java Socket y ServerSocket 34
81 Introduccion 3482 Sockets 35
821 La clase Socket 36822 La clase ServerSocket 38
83 La clase Thread y la implementacion de servidores 3984 Ejercicios 4085 Codigos Fuente del Servidor de chistes iterativo 4286 Codigos Fuente del Servidor de chistes concurrente 45
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 549
Capıtulo 1
Introduccion
El principal objetivo de esta parte del curso de doctorado es dotar al alumno de lashabilidades necesarias para la manipulacion de herramientas informaticas que le permitanrealizar una labor investigadora eficaz
En el desarrollo de un proyecto informatico uno de los aspectos mas importantes esla eleccion del lenguaje mas apropiado para su implementacion y las herramientas a uti-lizar Existen multiples herramientas informaticas y multiples lenguajes de programaciondependiendo del area de estudio Una vez elegido el lenguaje se ha de recabar informacionsobre las herramientas disponibles y realizar un estudio acerca de cual se adapta mejora las necesidades del proyecto a realizar Ası pues es necesario iniciar al alumnado en eldesarrollo sistematico y ordenado de aplicaciones informaticas integradas en proyectos de
investigacion En este curso se especifican de forma generica las fases que componen eldesarrollo e implementacion de una aplicacion informatica y se formalizan las mismas conejemplos concretos de realizacion
Los objetivos concretos del curso son
Manejar los fundamentos basicos del sistema operativo UNIX (Linux)
Conocer las herramientas informaticas UNIX (Linux) fundamentales para el desa-rrollo de aplicaciones
Comprender los principios basicos de la programacion imperativa y oritentada aobjetos
Reconocer la importacia de la generacion de documentacion que acompana a todoproyecto informatico
Comprender como disenar algoritmos eficientes utilizando distintas tecnicas algorıtmi-cas
11 Desarrollo de aplicaciones Informaticas
En este apartado se expone de forma escueta cuales son las partes que constituyen eldesarrollo de un programa esto es las etapas de desarrollo de software
3
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 649
Herramientas y Lenguajes de Programacion 06-07 4
Figura 11 Etapas del desarrollo de software
Las etapas de desarrollo de software se pueden resumir en
1 Disenar una solucion proponiendo un algoritmo
2 Traduccir la solucion a pseudocodigo
3 Implementar un programa en un lenguaje de programacion (en el caso que estudia-remos Java)
4 Compilar el programa
5 Realizar pruebas de ejecucion
Aunque las etapas se presentan de forma secuencial es habitual cometer errores que
provoquen el tener que regresar a fases anteriores El esquema que se muestra en la Fi-gura 11 es valido para programas no demasiado complejos Para los grandes proyectosinformaticos exite un conjunto de tecnicas de desarrollo que pueden estudiarse en cualquierlibro de Ingenierıa del Software por ejemplo RS Pressman Ingenierıa del Software Unenfoque Pratico McGraw-Hill 4 edicion 1998 ISBN 84-481-1186-9
12 Herramientas
En el desarrollo de un proyecto informatico un aspecto importante es que tipo de he-rramientas se han de utilizar y el lenguaje mas apropiado para su implementacion Existen
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 749
Herramientas y Lenguajes de Programacion 06-07 5
multiples herramientas informaticas y multiples lenguajes de programacion dependiendo
del area de estudioEl sistema operativo elegido para realizar los ejercicios practico es este curso es Unix
(Linux) debido a la diponibilidad de gran cantidad de herramientas que facilitan al pro-gramador el desarrollo y mantenimiento de sus programas En este epıgrafe se hara unrepaso de algunas de la principales herramientas que existen en el entorno Unix para eldesarrollo de programas en el lenguaje de programacion Java Estas herramientas inclu-yen los compiladores - en los cuales se pueden encontrar diferencias segun la version Unixutilizada- los interpretes de la maquina virtual de Java (lınea de comandos - stand-aloneo herramientas de visualizacion - appletviewer ) la creacion de paquetes o bibliotecas etc
121 Proceso de Compilacion
Un traductor es un programa informatico que traduce de un lenguaje fuente a unlenguaje objeto
Un compilador es un traductor en el que el lenguaje fuente es un Lenguaje de Progra-macion de Alto Nivel y el lenguaje objeto es Lenguaje Ensamblador o Lenguaje MaquinaEl proceso de traduccion que tiene que realizar un compilador se puede dividir en lossiguientes pasos
Preprocesamiento
Compilacion (propiamente dicho) y Optimizacion
Generacion de Codigo Objeto
Enlace ( linker )
No es uno de los objetivos de este curso el estudiar en profundidad el proceso de com-pilacion sino utilizar las herramientas disponibles para llevarlo a cabo Para un estudio endetalle de los compiladores recomendamos el libro A Aho R Sethi J Ullman Compila-dores Principios Tecnicas y Herramientas Adisson-Wesley Iberoamericana ISBN 0-201-62903-8
La Figura 12 muestra el conjunto de herramientas que proporciona el paquete GCCde GNU para los compiladores de los lenguajes C y C++
El prepocesador ( cpp ) se invoca con el comando
g++ programaC -E -o programai
El compilador propiamente dicho ( comp ) se llama con la orden
g++ programaC -S -o programas
La llamada al ensamblador ( as ) utiliza la opcion -c
g++ programaC -c -o programao
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 849
Herramientas y Lenguajes de Programacion 06-07 6
Figura 12 Herramientas del compilador de GCC
El editor de carga y enlace (ld) se invoca automaticamente sin especificar ninguna
opciong++ programaC
Se obtiene el fichero aout que ya es ejecutable
Los ficheros intermedios generados se almacenan en tmp y se borran cuando terminatodo el proceso de compilacion
En el caso de Java se habla de un lenguaje de programaci on y de una plataformade ejecucion Como lenguaje de programacion de alto nivel se ha de destacar que escompletamente orientado a objetos y tiene definida una sintaxis y una semantica Laplataforma de ejecucion de Java esta compuesta por
La Maquina Virtual de Java (Java Virtual Machine - JVM)
Los APIs (Application Programming Interfaces - Paquetes)
122 Compilacion de programas formados por varios modulos
Consideremos la division de la implementacion de un problema CC++ en dos ficherosprograma1cc y programa2cc Segun se muestra en la Figura 13 el primer paso consisteen editar dichos ficheros (con el editor vi por ejemplo) A continuaci on la orden que sedeberıa emitir para generar la aplicacion es
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 949
Herramientas y Lenguajes de Programacion 06-07 7
Figura 13 Compilacion de varios modulos separados
g++ programa1c programa2c
Se ha de tener en cuenta que la llamada al enlazador (linker) se realiza de formaautomatica Por lo tanto los dos ficheros intermedios programa1o y programa2o seborraran al finalizar la operacion Si se quieren conservar ambos es necesario compilar conlos comandos
g++ -c programa1c
g++ -c programa2c
g++ programa1o programa2o
La procedencia de los ficheros que aporta el sistema operativo al proceso de compilaciones la siguiente
Ficheros de Cabecera - directorio usrinclude
Librerıas - directorios lib usrlib
123 Creacion de Librerıas
La creacion de librerıas (o bibliotecas) aporta modularidad y portabilidad a los pro-gramas
Una librerıa es un fichero que esta compuesto por una coleccion de otros ficheros lla-mados miembros de la librerıa La estructura de una librerıa posibilita la extraccion de
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1049
Herramientas y Lenguajes de Programacion 06-07 8
sus miembros Cuando se anade un fichero a una librerıa los datos de este y su informa-
cion administrativa (permisos fechas propietario grupo etc) se introduce en el Parauna descripcion detallada de las opciones de esta herrmienta visite la p agina de manual( man ar)
Las funciones basicas de ar son crear modificar y extraer miembros
ar [-] opciones [miembro] librerıa [ficheros]
Entre las opciones se deben distinguir aquellas que son obligatorias y los modificadoresCuando se emite una orden ar es necesario que haya una obligatoria y solo una
Los paquetes Java agrupan las clases en librerıas (bibliotecas) Los paquetes Java seutilizan de forma similar a como se utilizan las librerıas en C++ solo que en Java se
agrupan clases yo interfacesEn los paquetes las clases son unicas comparadas con las de otros paquetes y permi-
ten controlar el acceso Esto es los paquetes proporcionan una forma de ocultar clasesevitando que otros programas o paquetes accedan a clases que son de uso exclusivo de unaaplicacion determinada
Los paquetes se declaran utilizando la palabra reservada package seguida del nombredel paquete Esta sentencia debe estar al comienzo del fichero fuente Concretamente debeser la primera sentencia ejecutable del codigo Java excluyendo los comentarios y espaciosen blanco Por ejemplo
package figuras
public class Circulo
En este caso el nombre del paquete es figuras La clase Circulo se considera comoparte del paquete La inclusion de nuevas clases en el paquete es simple se ha de colocarla misma sentencia al comienzo de los ficheros que contengan la declaracion de las clasesCada uno de los ficheros que contengan clases pertenecientes a un mismo paquete debenincluir la misma sentencia package y solamente puede haber una sentencia package porfichero La sentencia package colocada el comienzo de un fichero fuente afectara a todaslas clases que se declaren en ese fichero
Se pueden referenciar paquetes precediendo con su nombre la clase que se quiere usar
Tambien se puede usar la palabra reservada import si se van a colocar multiples referenciasa un mismo paquete
La sentencia import se utiliza para incluir una lista de paquetes en los que buscar unaclase determinada y su sintaxis es
import nombre_paqueteNombre_Clase
Esta sentencia o grupo de ellas deben aparecer antes de cualquier declaracion de claseen el codigo fuente
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1149
Herramientas y Lenguajes de Programacion 06-07 9
124 Documentacion
La herramienta javadoc genera paginas HTML de documentacion del API a partir deficheros con codigo fuente Java
En la lınea de comandos se le puede pasar a javadoc una serie de paquetes o ficherosJava para los que se desea generar documentacion Se genera documentacion para el pa-quete especificado o para los ficheros fuentes Java individuales que se listen en la lınea decomandos Se genera un fichero html por cada fichero java que se encuentre Tambiense genera la jerarquıa de clases (treehtml) y un ındice con todos los miembros que hadetectado (AllNameshtml)
La utilidad javadoc extrae informacion de los siguiente elementos
Paquetes
Clases e interfaces publicas
Metodos publicos y protegidos
Datos publicos y protegidos
Se puede anadir documentacion para todos estos entes a traves de comentarios dedocumentacion en el codigo fuente Estos comentarios pueden incluir marcas HTML Uncomentario de documentacion esta formado por todos los caracteres incluidos entre queindica el comienzo del comentario y que indica el final En todas las lıneas intermediaslos caracteres a la izquierda se ignoran y tambien todos los espacios y tabuladores queprecedan a ese caracter
Este es un comentario de documentacion
Se pueden incluir etiquetas HTML dentro de un comentario de documentacion aunqueno deben utilizarse las etiquetas lth1gt lth2gt o lıneas horizontales lthrgt porque javadoc
crea una estructura completa para el documento y estas marcas interfieren con el formatogeneral de ese documento
Cada comentario de documentacion puede incluir texto libre seguido de etiquetas de
documentaciacute on Estas etiquetas comienzan siempre con el signo y deben situarse alprincipio de la lınea (tener en cuenta que todo lo que haya hasta el primer caracter se ignora) y todas las etiquetas con el mismo nombre deben agruparse juntas dentro delcomentario de documentacion
Marcas de documentacion de clases e interface
see nombre_de_clase
Anade un enlace a la clase especificada en la zona ldquoSee Alsordquo Por ejemplo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1249
Herramientas y Lenguajes de Programacion 06-07 10
see javalangString
see Stringsee Stringequals
see javalangObjectwaint(int)
see CharacterMAX_RADIX
see lta href=spechtmlgtEspecif Javaltagt
Se utiliza el caracter para separar el nombre de una clase del nombre de uno desus campos de datos metodos o constructores
version texto-version
Anade una entrada ldquoVersionrdquo El texto no tiene que tener formato especial
author texto-autor
Anade una entrada ldquoAuthorrdquo El texto no tiene que tener formato especial
since texto
Este texto no tiene una estructura especial Se utiliza para indicar desde que fechao desde que version se ha introducido el cambio o caracterıstica que indica el texto
deprecated texto
Anade un comentario indicando que el metodo esta desautorizado y no deberıa uti-lizarse porque puede dejar de ser soportada por el API La convencion que se siguees indicar en el texto la funcion o metodo por quien se ha sustituido Ejemplo decomentario de una clase
Clase que representa la figura geometrica cilindro
Por ejemplo
ltPREgt
Cilindro c = new Cilindro(10)
double d = cvolumen()
ltPREgt
see figurasCirculo
see figurasObjetoGeometrico
version 15 14 Mar 04
author Coromoto Leon Hernandez
public class Cilindro extends Circulo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1349
Herramientas y Lenguajes de Programacion 06-07 11
Marcas de documentacion de campos de datos
La unica marca especial que se puede incluir es la marca see Ejemplo de comentariode un campo de datos
El palo de bastos
public static final int BASTOS = 1
Marcas de documentacion de constructores y metodos
Pueden ser marcas see y ademas
param parametro descripcion
Anade un parametro a la seccion ldquoParametersrdquo La descripcion puede continuar enla lınea siguiente
return descripcion
Anade una seccion ldquoReturnrdquo que debe contener la descripcion del valor a devolver
throws exception descripcion
Anade una entrada ldquoThrowsrdquo que contiene el nombre de la excepcion que puede ser
lanzada por el metodo La excepcion estara enlazada con su clase en la documenta-cion
see nombre_de_clase
Anade un enlace a la clase en la zona ldquoSee Alsordquo
since texto
Indica desde que fecha o desde que version se ha introducido el cambio o caracterısticaque indica el texto
deprecated texto
Indica que no deberıa utilizarse el metodo porque esta desautorizado y puede dejarde ser soportado por el API en cualquier momento Ejemplo de comentario de unmetodo
Devuelve el caracter de la posicion indicada entre
ltttgt0ltttgt y ltttgtlength()-1ltttgt
param indice La posicion del caracter a obtener
return El caracter situado en la posicion
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1449
Herramientas y Lenguajes de Programacion 06-07 12
Figura 14 Evolucion de la metodologıa de programacion
exception StringIndexOutOfRangeException
Se prodcue cuando el indice no esta en el rango ltttgt0ltttgt a ltttgtlength()-1ltttgt
public char charAt( int indice )
13 Lenguajes de Programacion
El debate en este caso se centra en la programacion orientada a objetos frente a laprogramacion tradicional La Figura 14 muestra la evolucion de la metodologıa de la
programacion desde los primeros tiempos de la informatica hasta hoyEn la historia de la programacion ha habido varias evoluciones sucesivas Una de lasprincipales fue la programacion estructurada cuyo principio fundamental era dividir unprograma en subprogramas mas pequenos y faciles de resolver hasta llegar a niveles decomplejidad elementales siempre apoyandose en la idea de iquestQue debe hacer el programa
Este metodo de diseno a pesar de haber dado resultados satisfactorios tiene limita-ciones Algunas de ellas son
No favorece la reulitizacion del codigo
Si en la figura anterior fn1 y fn2 fueran identicas este hecho seguramente pasarıadesapercibido y no se compartirıa una unica funcion fn
Si dos subprogramas comparten una misma funcion fn reutilizando ası el codigo quedefine la misma y mas adelante queremos modificar fn porque hay un cambio enuno de los subprogramas que la utilizan la modificacion afectara tambien al otrosubprograma razon por la que ahora tendremos que realizar dos funciones
Por lo tanto se tiene que la programacion tradicional se desarrolla a partir de proce-dimientos y datos sin delimitar que procedimientos actuan sobre que datos
El diseno orientado a objetos se interesa en primer lugar por los datos a los que seasocian posteriormente procedimientos En este caso la idea principal es iquestde que trata el
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1549
Herramientas y Lenguajes de Programacion 06-07 13
programa Ası que el desarrollo se organiza en torno a los datos y no a como se debefuncionar
En la programacion orientada a objetos un programa es una coleccion de una solaentidad basica el objeto el cual combina los datos con los procedimientos que actuan
sobre ellos Durante la ejecucion los ob jetos reciben y envıan mensajes a otros objetospara ejecutar las acciones requeridas
La programacion orientada a objetos se puede llevar a cabo con lenguajes convenciona-les pero esto exige al programador la construccion de los mecanismos de que disponen loslenguajes orientados a objetos tales como objetos clases metodos mensajes herenciaetc
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1649
Herramientas y Lenguajes de Programacion 06-07 14
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1749
Capıtulo 2
Programas Java Aplicaciones
El objetivo de este ejercicio practico es mostrar el modo de funcionamiento de losdistintos tipos de programas Java En este caso se abordar an las aplicaciones
21 Ejemplo de aplicacion
El codigo que aparece a continuacion implementa en Java la aplicacion que muestraen la terminal la frase ldquoHola Mundo en Javardquo
1
2 Applicacion Simple3
4 class AplicacionSimple
5 public static void main(String[] args)
6 Systemoutprintln(Hola Mundo en Java)
7
8
El primer paso para manipular una aplicacion Java es compilarla ejecutando en la lıneade comandos la instruccion
gtjavac AplicacionSimplejava
Es importante que el nombre del fichero que contiene el c odigo coincida exactamentecon el nombre de la clase que aparece en la lınea numero 3
Al realizar este paso se obtiene un fichero AplicacionSimpleclass Para ejecutar la aplicacion escribimos en la lınea de comandos
gtjava AplicacionSimple
y obtenemos el resultado que aparece en la figura 21
15
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1849
Herramientas y Lenguajes de Programacion 06-07 16
Figura 21 Ejecucion de la aplicacion
22 Ejercicios
1 Compile y ejecute el ejemplo de aplicacion
2 Escriba una aplicacion Java que
Contemple la creacion de una clase (Clase1) que contengan un atributo enteroy metodos para establecer y recuperar los valores de dicho atributo
Definir una segunda clase (Clase2) con un atributo que es un objeto de la
Clase1 y con un metodo que establece diez valores diferentes en el atributo dela Clase1
Definir una tercera clase (Clase3) con un atributo que es un objeto de la Clase1
y con un metodo que recupera diez valores del atributo de la Clase1
Finalmente crear una clase de prueba donde se instancien objetos de las clasesanteriores y se invoque a sus metodos
3 Escriba la jerarquıa de clases del programa que ha desarrollado
4 Dibuje una traza del flujo de ejecucion de la aplicacion
5 Comente sus clases utilizando javadoc genere ficheros de descripcion de su clase
similares a los de la documentacion de las API de Java
En el documento de descripcion de la herramienta Javadoc puede encontrar la formade uso de las distintas etiquetas disponibles
see author version param return
(conexion a javasuncom )
Ejecute el comando javadoc desde la lınea de comandos sin ningun argumento yobtendra una lista de las opciones con las que puede llamar a la herramienta
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1949
Herramientas y Lenguajes de Programacion 06-07 17
Notese que para que aparezcan en el fichero html los comentarios asociados a los
campos de datos privados tiene que compilarlos con la opcion -privateDe la misma forma para que aparezcan el autor y la versi on se han de utilizar lasopciones -author y -version
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2049
Capıtulo 3
Programas Java applets
El objetivo de esta practica es mostrar el modo de funcionamiento de los distintos tiposde programas Java En esta practica se abordaran los applets
31 Ejemplo de applet
El codigo que aparece a continuacion muestra la implementacion en Java del programaque muestra en la ventana principal del navegador la frase ldquoHola Mundo en Javardquo
Applet Sencillo
import javaappletApplet
import javaawtGraphics
public class AppletSimple extends Applet
public void paint(Graphics g)
gdrawString(Hola Mundo en Java 50 25)
El primer paso para manipular un applet Java es compilarlo ejecutando en la lınea decomandos la instruccion
gtjavac AppletSimplejava
Al realizar este paso se obtiene una fichero AppletSimpleclassEl fichero class resultante de la compilacion se ha de incrustar en un fichero para
ser ejecutado por un navegadorEn este caso las etiquetas a utilizar son ltAPPLETgt y ltAPPLETgt
18
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 249
Resumen
El curso ldquoHerramientas y Lenguajes de Programacionrdquo del programa de doctorado deldquoFısica e Informaticardquo esta clasificado como metodologico (optativo) La Figura 1 muestralos distintos itinerarios que se pueden seguir en el programa de doctorado
Figura 1 Itinerarios del Programa de Doctorado
El curso esta dividido en tres partes Este material cubre la parte del curso relacionadacon la manipulacion de herramientas informaticas y el desarrollo de aplicaciones
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 349
Indice general
1 Introduccion 2
11 Desarrollo de aplicaciones Informaticas 212 Herramientas 3121 Proceso de Compilacion 4122 Compilacion de programas formados por varios modulos 5123 Creacion de Librerıas 6124 Documentacion 8
13 Lenguajes de Programacion 11
2 Programas Java Aplicaciones 14
21 Ejemplo de aplicacion 1422 Ejercicios 15
3 Programas Java applets 17
31 Ejemplo de applet 1732 Ejercicios 19
4 Creacion de Threads 20
41 La clase Thread 2042 La interfaz Runnable 2143 Ejercicios 21
5 Sincronizacion de Threads 23
51 Exclusion mutua y secuencializacion 23
52 Ejercicios 24
6 Direcciones IP y Nombres de Dominio 25
61 La clase InetAddress 2562 Ejercicios 26
7 Las clases Java DatagramPacket y DatagramSocket 28
71 Introduccion 2872 La clase DatagramPacket 2973 La clase DatagramSocket 30
1
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 449
Herramientas y Lenguajes de Programacion 06-07 2
74 Ejercicios 31
8 Las clases Java Socket y ServerSocket 34
81 Introduccion 3482 Sockets 35
821 La clase Socket 36822 La clase ServerSocket 38
83 La clase Thread y la implementacion de servidores 3984 Ejercicios 4085 Codigos Fuente del Servidor de chistes iterativo 4286 Codigos Fuente del Servidor de chistes concurrente 45
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 549
Capıtulo 1
Introduccion
El principal objetivo de esta parte del curso de doctorado es dotar al alumno de lashabilidades necesarias para la manipulacion de herramientas informaticas que le permitanrealizar una labor investigadora eficaz
En el desarrollo de un proyecto informatico uno de los aspectos mas importantes esla eleccion del lenguaje mas apropiado para su implementacion y las herramientas a uti-lizar Existen multiples herramientas informaticas y multiples lenguajes de programaciondependiendo del area de estudio Una vez elegido el lenguaje se ha de recabar informacionsobre las herramientas disponibles y realizar un estudio acerca de cual se adapta mejora las necesidades del proyecto a realizar Ası pues es necesario iniciar al alumnado en eldesarrollo sistematico y ordenado de aplicaciones informaticas integradas en proyectos de
investigacion En este curso se especifican de forma generica las fases que componen eldesarrollo e implementacion de una aplicacion informatica y se formalizan las mismas conejemplos concretos de realizacion
Los objetivos concretos del curso son
Manejar los fundamentos basicos del sistema operativo UNIX (Linux)
Conocer las herramientas informaticas UNIX (Linux) fundamentales para el desa-rrollo de aplicaciones
Comprender los principios basicos de la programacion imperativa y oritentada aobjetos
Reconocer la importacia de la generacion de documentacion que acompana a todoproyecto informatico
Comprender como disenar algoritmos eficientes utilizando distintas tecnicas algorıtmi-cas
11 Desarrollo de aplicaciones Informaticas
En este apartado se expone de forma escueta cuales son las partes que constituyen eldesarrollo de un programa esto es las etapas de desarrollo de software
3
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 649
Herramientas y Lenguajes de Programacion 06-07 4
Figura 11 Etapas del desarrollo de software
Las etapas de desarrollo de software se pueden resumir en
1 Disenar una solucion proponiendo un algoritmo
2 Traduccir la solucion a pseudocodigo
3 Implementar un programa en un lenguaje de programacion (en el caso que estudia-remos Java)
4 Compilar el programa
5 Realizar pruebas de ejecucion
Aunque las etapas se presentan de forma secuencial es habitual cometer errores que
provoquen el tener que regresar a fases anteriores El esquema que se muestra en la Fi-gura 11 es valido para programas no demasiado complejos Para los grandes proyectosinformaticos exite un conjunto de tecnicas de desarrollo que pueden estudiarse en cualquierlibro de Ingenierıa del Software por ejemplo RS Pressman Ingenierıa del Software Unenfoque Pratico McGraw-Hill 4 edicion 1998 ISBN 84-481-1186-9
12 Herramientas
En el desarrollo de un proyecto informatico un aspecto importante es que tipo de he-rramientas se han de utilizar y el lenguaje mas apropiado para su implementacion Existen
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 749
Herramientas y Lenguajes de Programacion 06-07 5
multiples herramientas informaticas y multiples lenguajes de programacion dependiendo
del area de estudioEl sistema operativo elegido para realizar los ejercicios practico es este curso es Unix
(Linux) debido a la diponibilidad de gran cantidad de herramientas que facilitan al pro-gramador el desarrollo y mantenimiento de sus programas En este epıgrafe se hara unrepaso de algunas de la principales herramientas que existen en el entorno Unix para eldesarrollo de programas en el lenguaje de programacion Java Estas herramientas inclu-yen los compiladores - en los cuales se pueden encontrar diferencias segun la version Unixutilizada- los interpretes de la maquina virtual de Java (lınea de comandos - stand-aloneo herramientas de visualizacion - appletviewer ) la creacion de paquetes o bibliotecas etc
121 Proceso de Compilacion
Un traductor es un programa informatico que traduce de un lenguaje fuente a unlenguaje objeto
Un compilador es un traductor en el que el lenguaje fuente es un Lenguaje de Progra-macion de Alto Nivel y el lenguaje objeto es Lenguaje Ensamblador o Lenguaje MaquinaEl proceso de traduccion que tiene que realizar un compilador se puede dividir en lossiguientes pasos
Preprocesamiento
Compilacion (propiamente dicho) y Optimizacion
Generacion de Codigo Objeto
Enlace ( linker )
No es uno de los objetivos de este curso el estudiar en profundidad el proceso de com-pilacion sino utilizar las herramientas disponibles para llevarlo a cabo Para un estudio endetalle de los compiladores recomendamos el libro A Aho R Sethi J Ullman Compila-dores Principios Tecnicas y Herramientas Adisson-Wesley Iberoamericana ISBN 0-201-62903-8
La Figura 12 muestra el conjunto de herramientas que proporciona el paquete GCCde GNU para los compiladores de los lenguajes C y C++
El prepocesador ( cpp ) se invoca con el comando
g++ programaC -E -o programai
El compilador propiamente dicho ( comp ) se llama con la orden
g++ programaC -S -o programas
La llamada al ensamblador ( as ) utiliza la opcion -c
g++ programaC -c -o programao
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 849
Herramientas y Lenguajes de Programacion 06-07 6
Figura 12 Herramientas del compilador de GCC
El editor de carga y enlace (ld) se invoca automaticamente sin especificar ninguna
opciong++ programaC
Se obtiene el fichero aout que ya es ejecutable
Los ficheros intermedios generados se almacenan en tmp y se borran cuando terminatodo el proceso de compilacion
En el caso de Java se habla de un lenguaje de programaci on y de una plataformade ejecucion Como lenguaje de programacion de alto nivel se ha de destacar que escompletamente orientado a objetos y tiene definida una sintaxis y una semantica Laplataforma de ejecucion de Java esta compuesta por
La Maquina Virtual de Java (Java Virtual Machine - JVM)
Los APIs (Application Programming Interfaces - Paquetes)
122 Compilacion de programas formados por varios modulos
Consideremos la division de la implementacion de un problema CC++ en dos ficherosprograma1cc y programa2cc Segun se muestra en la Figura 13 el primer paso consisteen editar dichos ficheros (con el editor vi por ejemplo) A continuaci on la orden que sedeberıa emitir para generar la aplicacion es
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 949
Herramientas y Lenguajes de Programacion 06-07 7
Figura 13 Compilacion de varios modulos separados
g++ programa1c programa2c
Se ha de tener en cuenta que la llamada al enlazador (linker) se realiza de formaautomatica Por lo tanto los dos ficheros intermedios programa1o y programa2o seborraran al finalizar la operacion Si se quieren conservar ambos es necesario compilar conlos comandos
g++ -c programa1c
g++ -c programa2c
g++ programa1o programa2o
La procedencia de los ficheros que aporta el sistema operativo al proceso de compilaciones la siguiente
Ficheros de Cabecera - directorio usrinclude
Librerıas - directorios lib usrlib
123 Creacion de Librerıas
La creacion de librerıas (o bibliotecas) aporta modularidad y portabilidad a los pro-gramas
Una librerıa es un fichero que esta compuesto por una coleccion de otros ficheros lla-mados miembros de la librerıa La estructura de una librerıa posibilita la extraccion de
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1049
Herramientas y Lenguajes de Programacion 06-07 8
sus miembros Cuando se anade un fichero a una librerıa los datos de este y su informa-
cion administrativa (permisos fechas propietario grupo etc) se introduce en el Parauna descripcion detallada de las opciones de esta herrmienta visite la p agina de manual( man ar)
Las funciones basicas de ar son crear modificar y extraer miembros
ar [-] opciones [miembro] librerıa [ficheros]
Entre las opciones se deben distinguir aquellas que son obligatorias y los modificadoresCuando se emite una orden ar es necesario que haya una obligatoria y solo una
Los paquetes Java agrupan las clases en librerıas (bibliotecas) Los paquetes Java seutilizan de forma similar a como se utilizan las librerıas en C++ solo que en Java se
agrupan clases yo interfacesEn los paquetes las clases son unicas comparadas con las de otros paquetes y permi-
ten controlar el acceso Esto es los paquetes proporcionan una forma de ocultar clasesevitando que otros programas o paquetes accedan a clases que son de uso exclusivo de unaaplicacion determinada
Los paquetes se declaran utilizando la palabra reservada package seguida del nombredel paquete Esta sentencia debe estar al comienzo del fichero fuente Concretamente debeser la primera sentencia ejecutable del codigo Java excluyendo los comentarios y espaciosen blanco Por ejemplo
package figuras
public class Circulo
En este caso el nombre del paquete es figuras La clase Circulo se considera comoparte del paquete La inclusion de nuevas clases en el paquete es simple se ha de colocarla misma sentencia al comienzo de los ficheros que contengan la declaracion de las clasesCada uno de los ficheros que contengan clases pertenecientes a un mismo paquete debenincluir la misma sentencia package y solamente puede haber una sentencia package porfichero La sentencia package colocada el comienzo de un fichero fuente afectara a todaslas clases que se declaren en ese fichero
Se pueden referenciar paquetes precediendo con su nombre la clase que se quiere usar
Tambien se puede usar la palabra reservada import si se van a colocar multiples referenciasa un mismo paquete
La sentencia import se utiliza para incluir una lista de paquetes en los que buscar unaclase determinada y su sintaxis es
import nombre_paqueteNombre_Clase
Esta sentencia o grupo de ellas deben aparecer antes de cualquier declaracion de claseen el codigo fuente
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1149
Herramientas y Lenguajes de Programacion 06-07 9
124 Documentacion
La herramienta javadoc genera paginas HTML de documentacion del API a partir deficheros con codigo fuente Java
En la lınea de comandos se le puede pasar a javadoc una serie de paquetes o ficherosJava para los que se desea generar documentacion Se genera documentacion para el pa-quete especificado o para los ficheros fuentes Java individuales que se listen en la lınea decomandos Se genera un fichero html por cada fichero java que se encuentre Tambiense genera la jerarquıa de clases (treehtml) y un ındice con todos los miembros que hadetectado (AllNameshtml)
La utilidad javadoc extrae informacion de los siguiente elementos
Paquetes
Clases e interfaces publicas
Metodos publicos y protegidos
Datos publicos y protegidos
Se puede anadir documentacion para todos estos entes a traves de comentarios dedocumentacion en el codigo fuente Estos comentarios pueden incluir marcas HTML Uncomentario de documentacion esta formado por todos los caracteres incluidos entre queindica el comienzo del comentario y que indica el final En todas las lıneas intermediaslos caracteres a la izquierda se ignoran y tambien todos los espacios y tabuladores queprecedan a ese caracter
Este es un comentario de documentacion
Se pueden incluir etiquetas HTML dentro de un comentario de documentacion aunqueno deben utilizarse las etiquetas lth1gt lth2gt o lıneas horizontales lthrgt porque javadoc
crea una estructura completa para el documento y estas marcas interfieren con el formatogeneral de ese documento
Cada comentario de documentacion puede incluir texto libre seguido de etiquetas de
documentaciacute on Estas etiquetas comienzan siempre con el signo y deben situarse alprincipio de la lınea (tener en cuenta que todo lo que haya hasta el primer caracter se ignora) y todas las etiquetas con el mismo nombre deben agruparse juntas dentro delcomentario de documentacion
Marcas de documentacion de clases e interface
see nombre_de_clase
Anade un enlace a la clase especificada en la zona ldquoSee Alsordquo Por ejemplo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1249
Herramientas y Lenguajes de Programacion 06-07 10
see javalangString
see Stringsee Stringequals
see javalangObjectwaint(int)
see CharacterMAX_RADIX
see lta href=spechtmlgtEspecif Javaltagt
Se utiliza el caracter para separar el nombre de una clase del nombre de uno desus campos de datos metodos o constructores
version texto-version
Anade una entrada ldquoVersionrdquo El texto no tiene que tener formato especial
author texto-autor
Anade una entrada ldquoAuthorrdquo El texto no tiene que tener formato especial
since texto
Este texto no tiene una estructura especial Se utiliza para indicar desde que fechao desde que version se ha introducido el cambio o caracterıstica que indica el texto
deprecated texto
Anade un comentario indicando que el metodo esta desautorizado y no deberıa uti-lizarse porque puede dejar de ser soportada por el API La convencion que se siguees indicar en el texto la funcion o metodo por quien se ha sustituido Ejemplo decomentario de una clase
Clase que representa la figura geometrica cilindro
Por ejemplo
ltPREgt
Cilindro c = new Cilindro(10)
double d = cvolumen()
ltPREgt
see figurasCirculo
see figurasObjetoGeometrico
version 15 14 Mar 04
author Coromoto Leon Hernandez
public class Cilindro extends Circulo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1349
Herramientas y Lenguajes de Programacion 06-07 11
Marcas de documentacion de campos de datos
La unica marca especial que se puede incluir es la marca see Ejemplo de comentariode un campo de datos
El palo de bastos
public static final int BASTOS = 1
Marcas de documentacion de constructores y metodos
Pueden ser marcas see y ademas
param parametro descripcion
Anade un parametro a la seccion ldquoParametersrdquo La descripcion puede continuar enla lınea siguiente
return descripcion
Anade una seccion ldquoReturnrdquo que debe contener la descripcion del valor a devolver
throws exception descripcion
Anade una entrada ldquoThrowsrdquo que contiene el nombre de la excepcion que puede ser
lanzada por el metodo La excepcion estara enlazada con su clase en la documenta-cion
see nombre_de_clase
Anade un enlace a la clase en la zona ldquoSee Alsordquo
since texto
Indica desde que fecha o desde que version se ha introducido el cambio o caracterısticaque indica el texto
deprecated texto
Indica que no deberıa utilizarse el metodo porque esta desautorizado y puede dejarde ser soportado por el API en cualquier momento Ejemplo de comentario de unmetodo
Devuelve el caracter de la posicion indicada entre
ltttgt0ltttgt y ltttgtlength()-1ltttgt
param indice La posicion del caracter a obtener
return El caracter situado en la posicion
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1449
Herramientas y Lenguajes de Programacion 06-07 12
Figura 14 Evolucion de la metodologıa de programacion
exception StringIndexOutOfRangeException
Se prodcue cuando el indice no esta en el rango ltttgt0ltttgt a ltttgtlength()-1ltttgt
public char charAt( int indice )
13 Lenguajes de Programacion
El debate en este caso se centra en la programacion orientada a objetos frente a laprogramacion tradicional La Figura 14 muestra la evolucion de la metodologıa de la
programacion desde los primeros tiempos de la informatica hasta hoyEn la historia de la programacion ha habido varias evoluciones sucesivas Una de lasprincipales fue la programacion estructurada cuyo principio fundamental era dividir unprograma en subprogramas mas pequenos y faciles de resolver hasta llegar a niveles decomplejidad elementales siempre apoyandose en la idea de iquestQue debe hacer el programa
Este metodo de diseno a pesar de haber dado resultados satisfactorios tiene limita-ciones Algunas de ellas son
No favorece la reulitizacion del codigo
Si en la figura anterior fn1 y fn2 fueran identicas este hecho seguramente pasarıadesapercibido y no se compartirıa una unica funcion fn
Si dos subprogramas comparten una misma funcion fn reutilizando ası el codigo quedefine la misma y mas adelante queremos modificar fn porque hay un cambio enuno de los subprogramas que la utilizan la modificacion afectara tambien al otrosubprograma razon por la que ahora tendremos que realizar dos funciones
Por lo tanto se tiene que la programacion tradicional se desarrolla a partir de proce-dimientos y datos sin delimitar que procedimientos actuan sobre que datos
El diseno orientado a objetos se interesa en primer lugar por los datos a los que seasocian posteriormente procedimientos En este caso la idea principal es iquestde que trata el
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1549
Herramientas y Lenguajes de Programacion 06-07 13
programa Ası que el desarrollo se organiza en torno a los datos y no a como se debefuncionar
En la programacion orientada a objetos un programa es una coleccion de una solaentidad basica el objeto el cual combina los datos con los procedimientos que actuan
sobre ellos Durante la ejecucion los ob jetos reciben y envıan mensajes a otros objetospara ejecutar las acciones requeridas
La programacion orientada a objetos se puede llevar a cabo con lenguajes convenciona-les pero esto exige al programador la construccion de los mecanismos de que disponen loslenguajes orientados a objetos tales como objetos clases metodos mensajes herenciaetc
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1649
Herramientas y Lenguajes de Programacion 06-07 14
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1749
Capıtulo 2
Programas Java Aplicaciones
El objetivo de este ejercicio practico es mostrar el modo de funcionamiento de losdistintos tipos de programas Java En este caso se abordar an las aplicaciones
21 Ejemplo de aplicacion
El codigo que aparece a continuacion implementa en Java la aplicacion que muestraen la terminal la frase ldquoHola Mundo en Javardquo
1
2 Applicacion Simple3
4 class AplicacionSimple
5 public static void main(String[] args)
6 Systemoutprintln(Hola Mundo en Java)
7
8
El primer paso para manipular una aplicacion Java es compilarla ejecutando en la lıneade comandos la instruccion
gtjavac AplicacionSimplejava
Es importante que el nombre del fichero que contiene el c odigo coincida exactamentecon el nombre de la clase que aparece en la lınea numero 3
Al realizar este paso se obtiene un fichero AplicacionSimpleclass Para ejecutar la aplicacion escribimos en la lınea de comandos
gtjava AplicacionSimple
y obtenemos el resultado que aparece en la figura 21
15
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1849
Herramientas y Lenguajes de Programacion 06-07 16
Figura 21 Ejecucion de la aplicacion
22 Ejercicios
1 Compile y ejecute el ejemplo de aplicacion
2 Escriba una aplicacion Java que
Contemple la creacion de una clase (Clase1) que contengan un atributo enteroy metodos para establecer y recuperar los valores de dicho atributo
Definir una segunda clase (Clase2) con un atributo que es un objeto de la
Clase1 y con un metodo que establece diez valores diferentes en el atributo dela Clase1
Definir una tercera clase (Clase3) con un atributo que es un objeto de la Clase1
y con un metodo que recupera diez valores del atributo de la Clase1
Finalmente crear una clase de prueba donde se instancien objetos de las clasesanteriores y se invoque a sus metodos
3 Escriba la jerarquıa de clases del programa que ha desarrollado
4 Dibuje una traza del flujo de ejecucion de la aplicacion
5 Comente sus clases utilizando javadoc genere ficheros de descripcion de su clase
similares a los de la documentacion de las API de Java
En el documento de descripcion de la herramienta Javadoc puede encontrar la formade uso de las distintas etiquetas disponibles
see author version param return
(conexion a javasuncom )
Ejecute el comando javadoc desde la lınea de comandos sin ningun argumento yobtendra una lista de las opciones con las que puede llamar a la herramienta
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1949
Herramientas y Lenguajes de Programacion 06-07 17
Notese que para que aparezcan en el fichero html los comentarios asociados a los
campos de datos privados tiene que compilarlos con la opcion -privateDe la misma forma para que aparezcan el autor y la versi on se han de utilizar lasopciones -author y -version
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2049
Capıtulo 3
Programas Java applets
El objetivo de esta practica es mostrar el modo de funcionamiento de los distintos tiposde programas Java En esta practica se abordaran los applets
31 Ejemplo de applet
El codigo que aparece a continuacion muestra la implementacion en Java del programaque muestra en la ventana principal del navegador la frase ldquoHola Mundo en Javardquo
Applet Sencillo
import javaappletApplet
import javaawtGraphics
public class AppletSimple extends Applet
public void paint(Graphics g)
gdrawString(Hola Mundo en Java 50 25)
El primer paso para manipular un applet Java es compilarlo ejecutando en la lınea decomandos la instruccion
gtjavac AppletSimplejava
Al realizar este paso se obtiene una fichero AppletSimpleclassEl fichero class resultante de la compilacion se ha de incrustar en un fichero para
ser ejecutado por un navegadorEn este caso las etiquetas a utilizar son ltAPPLETgt y ltAPPLETgt
18
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 349
Indice general
1 Introduccion 2
11 Desarrollo de aplicaciones Informaticas 212 Herramientas 3121 Proceso de Compilacion 4122 Compilacion de programas formados por varios modulos 5123 Creacion de Librerıas 6124 Documentacion 8
13 Lenguajes de Programacion 11
2 Programas Java Aplicaciones 14
21 Ejemplo de aplicacion 1422 Ejercicios 15
3 Programas Java applets 17
31 Ejemplo de applet 1732 Ejercicios 19
4 Creacion de Threads 20
41 La clase Thread 2042 La interfaz Runnable 2143 Ejercicios 21
5 Sincronizacion de Threads 23
51 Exclusion mutua y secuencializacion 23
52 Ejercicios 24
6 Direcciones IP y Nombres de Dominio 25
61 La clase InetAddress 2562 Ejercicios 26
7 Las clases Java DatagramPacket y DatagramSocket 28
71 Introduccion 2872 La clase DatagramPacket 2973 La clase DatagramSocket 30
1
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 449
Herramientas y Lenguajes de Programacion 06-07 2
74 Ejercicios 31
8 Las clases Java Socket y ServerSocket 34
81 Introduccion 3482 Sockets 35
821 La clase Socket 36822 La clase ServerSocket 38
83 La clase Thread y la implementacion de servidores 3984 Ejercicios 4085 Codigos Fuente del Servidor de chistes iterativo 4286 Codigos Fuente del Servidor de chistes concurrente 45
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 549
Capıtulo 1
Introduccion
El principal objetivo de esta parte del curso de doctorado es dotar al alumno de lashabilidades necesarias para la manipulacion de herramientas informaticas que le permitanrealizar una labor investigadora eficaz
En el desarrollo de un proyecto informatico uno de los aspectos mas importantes esla eleccion del lenguaje mas apropiado para su implementacion y las herramientas a uti-lizar Existen multiples herramientas informaticas y multiples lenguajes de programaciondependiendo del area de estudio Una vez elegido el lenguaje se ha de recabar informacionsobre las herramientas disponibles y realizar un estudio acerca de cual se adapta mejora las necesidades del proyecto a realizar Ası pues es necesario iniciar al alumnado en eldesarrollo sistematico y ordenado de aplicaciones informaticas integradas en proyectos de
investigacion En este curso se especifican de forma generica las fases que componen eldesarrollo e implementacion de una aplicacion informatica y se formalizan las mismas conejemplos concretos de realizacion
Los objetivos concretos del curso son
Manejar los fundamentos basicos del sistema operativo UNIX (Linux)
Conocer las herramientas informaticas UNIX (Linux) fundamentales para el desa-rrollo de aplicaciones
Comprender los principios basicos de la programacion imperativa y oritentada aobjetos
Reconocer la importacia de la generacion de documentacion que acompana a todoproyecto informatico
Comprender como disenar algoritmos eficientes utilizando distintas tecnicas algorıtmi-cas
11 Desarrollo de aplicaciones Informaticas
En este apartado se expone de forma escueta cuales son las partes que constituyen eldesarrollo de un programa esto es las etapas de desarrollo de software
3
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 649
Herramientas y Lenguajes de Programacion 06-07 4
Figura 11 Etapas del desarrollo de software
Las etapas de desarrollo de software se pueden resumir en
1 Disenar una solucion proponiendo un algoritmo
2 Traduccir la solucion a pseudocodigo
3 Implementar un programa en un lenguaje de programacion (en el caso que estudia-remos Java)
4 Compilar el programa
5 Realizar pruebas de ejecucion
Aunque las etapas se presentan de forma secuencial es habitual cometer errores que
provoquen el tener que regresar a fases anteriores El esquema que se muestra en la Fi-gura 11 es valido para programas no demasiado complejos Para los grandes proyectosinformaticos exite un conjunto de tecnicas de desarrollo que pueden estudiarse en cualquierlibro de Ingenierıa del Software por ejemplo RS Pressman Ingenierıa del Software Unenfoque Pratico McGraw-Hill 4 edicion 1998 ISBN 84-481-1186-9
12 Herramientas
En el desarrollo de un proyecto informatico un aspecto importante es que tipo de he-rramientas se han de utilizar y el lenguaje mas apropiado para su implementacion Existen
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 749
Herramientas y Lenguajes de Programacion 06-07 5
multiples herramientas informaticas y multiples lenguajes de programacion dependiendo
del area de estudioEl sistema operativo elegido para realizar los ejercicios practico es este curso es Unix
(Linux) debido a la diponibilidad de gran cantidad de herramientas que facilitan al pro-gramador el desarrollo y mantenimiento de sus programas En este epıgrafe se hara unrepaso de algunas de la principales herramientas que existen en el entorno Unix para eldesarrollo de programas en el lenguaje de programacion Java Estas herramientas inclu-yen los compiladores - en los cuales se pueden encontrar diferencias segun la version Unixutilizada- los interpretes de la maquina virtual de Java (lınea de comandos - stand-aloneo herramientas de visualizacion - appletviewer ) la creacion de paquetes o bibliotecas etc
121 Proceso de Compilacion
Un traductor es un programa informatico que traduce de un lenguaje fuente a unlenguaje objeto
Un compilador es un traductor en el que el lenguaje fuente es un Lenguaje de Progra-macion de Alto Nivel y el lenguaje objeto es Lenguaje Ensamblador o Lenguaje MaquinaEl proceso de traduccion que tiene que realizar un compilador se puede dividir en lossiguientes pasos
Preprocesamiento
Compilacion (propiamente dicho) y Optimizacion
Generacion de Codigo Objeto
Enlace ( linker )
No es uno de los objetivos de este curso el estudiar en profundidad el proceso de com-pilacion sino utilizar las herramientas disponibles para llevarlo a cabo Para un estudio endetalle de los compiladores recomendamos el libro A Aho R Sethi J Ullman Compila-dores Principios Tecnicas y Herramientas Adisson-Wesley Iberoamericana ISBN 0-201-62903-8
La Figura 12 muestra el conjunto de herramientas que proporciona el paquete GCCde GNU para los compiladores de los lenguajes C y C++
El prepocesador ( cpp ) se invoca con el comando
g++ programaC -E -o programai
El compilador propiamente dicho ( comp ) se llama con la orden
g++ programaC -S -o programas
La llamada al ensamblador ( as ) utiliza la opcion -c
g++ programaC -c -o programao
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 849
Herramientas y Lenguajes de Programacion 06-07 6
Figura 12 Herramientas del compilador de GCC
El editor de carga y enlace (ld) se invoca automaticamente sin especificar ninguna
opciong++ programaC
Se obtiene el fichero aout que ya es ejecutable
Los ficheros intermedios generados se almacenan en tmp y se borran cuando terminatodo el proceso de compilacion
En el caso de Java se habla de un lenguaje de programaci on y de una plataformade ejecucion Como lenguaje de programacion de alto nivel se ha de destacar que escompletamente orientado a objetos y tiene definida una sintaxis y una semantica Laplataforma de ejecucion de Java esta compuesta por
La Maquina Virtual de Java (Java Virtual Machine - JVM)
Los APIs (Application Programming Interfaces - Paquetes)
122 Compilacion de programas formados por varios modulos
Consideremos la division de la implementacion de un problema CC++ en dos ficherosprograma1cc y programa2cc Segun se muestra en la Figura 13 el primer paso consisteen editar dichos ficheros (con el editor vi por ejemplo) A continuaci on la orden que sedeberıa emitir para generar la aplicacion es
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 949
Herramientas y Lenguajes de Programacion 06-07 7
Figura 13 Compilacion de varios modulos separados
g++ programa1c programa2c
Se ha de tener en cuenta que la llamada al enlazador (linker) se realiza de formaautomatica Por lo tanto los dos ficheros intermedios programa1o y programa2o seborraran al finalizar la operacion Si se quieren conservar ambos es necesario compilar conlos comandos
g++ -c programa1c
g++ -c programa2c
g++ programa1o programa2o
La procedencia de los ficheros que aporta el sistema operativo al proceso de compilaciones la siguiente
Ficheros de Cabecera - directorio usrinclude
Librerıas - directorios lib usrlib
123 Creacion de Librerıas
La creacion de librerıas (o bibliotecas) aporta modularidad y portabilidad a los pro-gramas
Una librerıa es un fichero que esta compuesto por una coleccion de otros ficheros lla-mados miembros de la librerıa La estructura de una librerıa posibilita la extraccion de
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1049
Herramientas y Lenguajes de Programacion 06-07 8
sus miembros Cuando se anade un fichero a una librerıa los datos de este y su informa-
cion administrativa (permisos fechas propietario grupo etc) se introduce en el Parauna descripcion detallada de las opciones de esta herrmienta visite la p agina de manual( man ar)
Las funciones basicas de ar son crear modificar y extraer miembros
ar [-] opciones [miembro] librerıa [ficheros]
Entre las opciones se deben distinguir aquellas que son obligatorias y los modificadoresCuando se emite una orden ar es necesario que haya una obligatoria y solo una
Los paquetes Java agrupan las clases en librerıas (bibliotecas) Los paquetes Java seutilizan de forma similar a como se utilizan las librerıas en C++ solo que en Java se
agrupan clases yo interfacesEn los paquetes las clases son unicas comparadas con las de otros paquetes y permi-
ten controlar el acceso Esto es los paquetes proporcionan una forma de ocultar clasesevitando que otros programas o paquetes accedan a clases que son de uso exclusivo de unaaplicacion determinada
Los paquetes se declaran utilizando la palabra reservada package seguida del nombredel paquete Esta sentencia debe estar al comienzo del fichero fuente Concretamente debeser la primera sentencia ejecutable del codigo Java excluyendo los comentarios y espaciosen blanco Por ejemplo
package figuras
public class Circulo
En este caso el nombre del paquete es figuras La clase Circulo se considera comoparte del paquete La inclusion de nuevas clases en el paquete es simple se ha de colocarla misma sentencia al comienzo de los ficheros que contengan la declaracion de las clasesCada uno de los ficheros que contengan clases pertenecientes a un mismo paquete debenincluir la misma sentencia package y solamente puede haber una sentencia package porfichero La sentencia package colocada el comienzo de un fichero fuente afectara a todaslas clases que se declaren en ese fichero
Se pueden referenciar paquetes precediendo con su nombre la clase que se quiere usar
Tambien se puede usar la palabra reservada import si se van a colocar multiples referenciasa un mismo paquete
La sentencia import se utiliza para incluir una lista de paquetes en los que buscar unaclase determinada y su sintaxis es
import nombre_paqueteNombre_Clase
Esta sentencia o grupo de ellas deben aparecer antes de cualquier declaracion de claseen el codigo fuente
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1149
Herramientas y Lenguajes de Programacion 06-07 9
124 Documentacion
La herramienta javadoc genera paginas HTML de documentacion del API a partir deficheros con codigo fuente Java
En la lınea de comandos se le puede pasar a javadoc una serie de paquetes o ficherosJava para los que se desea generar documentacion Se genera documentacion para el pa-quete especificado o para los ficheros fuentes Java individuales que se listen en la lınea decomandos Se genera un fichero html por cada fichero java que se encuentre Tambiense genera la jerarquıa de clases (treehtml) y un ındice con todos los miembros que hadetectado (AllNameshtml)
La utilidad javadoc extrae informacion de los siguiente elementos
Paquetes
Clases e interfaces publicas
Metodos publicos y protegidos
Datos publicos y protegidos
Se puede anadir documentacion para todos estos entes a traves de comentarios dedocumentacion en el codigo fuente Estos comentarios pueden incluir marcas HTML Uncomentario de documentacion esta formado por todos los caracteres incluidos entre queindica el comienzo del comentario y que indica el final En todas las lıneas intermediaslos caracteres a la izquierda se ignoran y tambien todos los espacios y tabuladores queprecedan a ese caracter
Este es un comentario de documentacion
Se pueden incluir etiquetas HTML dentro de un comentario de documentacion aunqueno deben utilizarse las etiquetas lth1gt lth2gt o lıneas horizontales lthrgt porque javadoc
crea una estructura completa para el documento y estas marcas interfieren con el formatogeneral de ese documento
Cada comentario de documentacion puede incluir texto libre seguido de etiquetas de
documentaciacute on Estas etiquetas comienzan siempre con el signo y deben situarse alprincipio de la lınea (tener en cuenta que todo lo que haya hasta el primer caracter se ignora) y todas las etiquetas con el mismo nombre deben agruparse juntas dentro delcomentario de documentacion
Marcas de documentacion de clases e interface
see nombre_de_clase
Anade un enlace a la clase especificada en la zona ldquoSee Alsordquo Por ejemplo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1249
Herramientas y Lenguajes de Programacion 06-07 10
see javalangString
see Stringsee Stringequals
see javalangObjectwaint(int)
see CharacterMAX_RADIX
see lta href=spechtmlgtEspecif Javaltagt
Se utiliza el caracter para separar el nombre de una clase del nombre de uno desus campos de datos metodos o constructores
version texto-version
Anade una entrada ldquoVersionrdquo El texto no tiene que tener formato especial
author texto-autor
Anade una entrada ldquoAuthorrdquo El texto no tiene que tener formato especial
since texto
Este texto no tiene una estructura especial Se utiliza para indicar desde que fechao desde que version se ha introducido el cambio o caracterıstica que indica el texto
deprecated texto
Anade un comentario indicando que el metodo esta desautorizado y no deberıa uti-lizarse porque puede dejar de ser soportada por el API La convencion que se siguees indicar en el texto la funcion o metodo por quien se ha sustituido Ejemplo decomentario de una clase
Clase que representa la figura geometrica cilindro
Por ejemplo
ltPREgt
Cilindro c = new Cilindro(10)
double d = cvolumen()
ltPREgt
see figurasCirculo
see figurasObjetoGeometrico
version 15 14 Mar 04
author Coromoto Leon Hernandez
public class Cilindro extends Circulo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1349
Herramientas y Lenguajes de Programacion 06-07 11
Marcas de documentacion de campos de datos
La unica marca especial que se puede incluir es la marca see Ejemplo de comentariode un campo de datos
El palo de bastos
public static final int BASTOS = 1
Marcas de documentacion de constructores y metodos
Pueden ser marcas see y ademas
param parametro descripcion
Anade un parametro a la seccion ldquoParametersrdquo La descripcion puede continuar enla lınea siguiente
return descripcion
Anade una seccion ldquoReturnrdquo que debe contener la descripcion del valor a devolver
throws exception descripcion
Anade una entrada ldquoThrowsrdquo que contiene el nombre de la excepcion que puede ser
lanzada por el metodo La excepcion estara enlazada con su clase en la documenta-cion
see nombre_de_clase
Anade un enlace a la clase en la zona ldquoSee Alsordquo
since texto
Indica desde que fecha o desde que version se ha introducido el cambio o caracterısticaque indica el texto
deprecated texto
Indica que no deberıa utilizarse el metodo porque esta desautorizado y puede dejarde ser soportado por el API en cualquier momento Ejemplo de comentario de unmetodo
Devuelve el caracter de la posicion indicada entre
ltttgt0ltttgt y ltttgtlength()-1ltttgt
param indice La posicion del caracter a obtener
return El caracter situado en la posicion
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1449
Herramientas y Lenguajes de Programacion 06-07 12
Figura 14 Evolucion de la metodologıa de programacion
exception StringIndexOutOfRangeException
Se prodcue cuando el indice no esta en el rango ltttgt0ltttgt a ltttgtlength()-1ltttgt
public char charAt( int indice )
13 Lenguajes de Programacion
El debate en este caso se centra en la programacion orientada a objetos frente a laprogramacion tradicional La Figura 14 muestra la evolucion de la metodologıa de la
programacion desde los primeros tiempos de la informatica hasta hoyEn la historia de la programacion ha habido varias evoluciones sucesivas Una de lasprincipales fue la programacion estructurada cuyo principio fundamental era dividir unprograma en subprogramas mas pequenos y faciles de resolver hasta llegar a niveles decomplejidad elementales siempre apoyandose en la idea de iquestQue debe hacer el programa
Este metodo de diseno a pesar de haber dado resultados satisfactorios tiene limita-ciones Algunas de ellas son
No favorece la reulitizacion del codigo
Si en la figura anterior fn1 y fn2 fueran identicas este hecho seguramente pasarıadesapercibido y no se compartirıa una unica funcion fn
Si dos subprogramas comparten una misma funcion fn reutilizando ası el codigo quedefine la misma y mas adelante queremos modificar fn porque hay un cambio enuno de los subprogramas que la utilizan la modificacion afectara tambien al otrosubprograma razon por la que ahora tendremos que realizar dos funciones
Por lo tanto se tiene que la programacion tradicional se desarrolla a partir de proce-dimientos y datos sin delimitar que procedimientos actuan sobre que datos
El diseno orientado a objetos se interesa en primer lugar por los datos a los que seasocian posteriormente procedimientos En este caso la idea principal es iquestde que trata el
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1549
Herramientas y Lenguajes de Programacion 06-07 13
programa Ası que el desarrollo se organiza en torno a los datos y no a como se debefuncionar
En la programacion orientada a objetos un programa es una coleccion de una solaentidad basica el objeto el cual combina los datos con los procedimientos que actuan
sobre ellos Durante la ejecucion los ob jetos reciben y envıan mensajes a otros objetospara ejecutar las acciones requeridas
La programacion orientada a objetos se puede llevar a cabo con lenguajes convenciona-les pero esto exige al programador la construccion de los mecanismos de que disponen loslenguajes orientados a objetos tales como objetos clases metodos mensajes herenciaetc
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1649
Herramientas y Lenguajes de Programacion 06-07 14
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1749
Capıtulo 2
Programas Java Aplicaciones
El objetivo de este ejercicio practico es mostrar el modo de funcionamiento de losdistintos tipos de programas Java En este caso se abordar an las aplicaciones
21 Ejemplo de aplicacion
El codigo que aparece a continuacion implementa en Java la aplicacion que muestraen la terminal la frase ldquoHola Mundo en Javardquo
1
2 Applicacion Simple3
4 class AplicacionSimple
5 public static void main(String[] args)
6 Systemoutprintln(Hola Mundo en Java)
7
8
El primer paso para manipular una aplicacion Java es compilarla ejecutando en la lıneade comandos la instruccion
gtjavac AplicacionSimplejava
Es importante que el nombre del fichero que contiene el c odigo coincida exactamentecon el nombre de la clase que aparece en la lınea numero 3
Al realizar este paso se obtiene un fichero AplicacionSimpleclass Para ejecutar la aplicacion escribimos en la lınea de comandos
gtjava AplicacionSimple
y obtenemos el resultado que aparece en la figura 21
15
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1849
Herramientas y Lenguajes de Programacion 06-07 16
Figura 21 Ejecucion de la aplicacion
22 Ejercicios
1 Compile y ejecute el ejemplo de aplicacion
2 Escriba una aplicacion Java que
Contemple la creacion de una clase (Clase1) que contengan un atributo enteroy metodos para establecer y recuperar los valores de dicho atributo
Definir una segunda clase (Clase2) con un atributo que es un objeto de la
Clase1 y con un metodo que establece diez valores diferentes en el atributo dela Clase1
Definir una tercera clase (Clase3) con un atributo que es un objeto de la Clase1
y con un metodo que recupera diez valores del atributo de la Clase1
Finalmente crear una clase de prueba donde se instancien objetos de las clasesanteriores y se invoque a sus metodos
3 Escriba la jerarquıa de clases del programa que ha desarrollado
4 Dibuje una traza del flujo de ejecucion de la aplicacion
5 Comente sus clases utilizando javadoc genere ficheros de descripcion de su clase
similares a los de la documentacion de las API de Java
En el documento de descripcion de la herramienta Javadoc puede encontrar la formade uso de las distintas etiquetas disponibles
see author version param return
(conexion a javasuncom )
Ejecute el comando javadoc desde la lınea de comandos sin ningun argumento yobtendra una lista de las opciones con las que puede llamar a la herramienta
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1949
Herramientas y Lenguajes de Programacion 06-07 17
Notese que para que aparezcan en el fichero html los comentarios asociados a los
campos de datos privados tiene que compilarlos con la opcion -privateDe la misma forma para que aparezcan el autor y la versi on se han de utilizar lasopciones -author y -version
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2049
Capıtulo 3
Programas Java applets
El objetivo de esta practica es mostrar el modo de funcionamiento de los distintos tiposde programas Java En esta practica se abordaran los applets
31 Ejemplo de applet
El codigo que aparece a continuacion muestra la implementacion en Java del programaque muestra en la ventana principal del navegador la frase ldquoHola Mundo en Javardquo
Applet Sencillo
import javaappletApplet
import javaawtGraphics
public class AppletSimple extends Applet
public void paint(Graphics g)
gdrawString(Hola Mundo en Java 50 25)
El primer paso para manipular un applet Java es compilarlo ejecutando en la lınea decomandos la instruccion
gtjavac AppletSimplejava
Al realizar este paso se obtiene una fichero AppletSimpleclassEl fichero class resultante de la compilacion se ha de incrustar en un fichero para
ser ejecutado por un navegadorEn este caso las etiquetas a utilizar son ltAPPLETgt y ltAPPLETgt
18
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 449
Herramientas y Lenguajes de Programacion 06-07 2
74 Ejercicios 31
8 Las clases Java Socket y ServerSocket 34
81 Introduccion 3482 Sockets 35
821 La clase Socket 36822 La clase ServerSocket 38
83 La clase Thread y la implementacion de servidores 3984 Ejercicios 4085 Codigos Fuente del Servidor de chistes iterativo 4286 Codigos Fuente del Servidor de chistes concurrente 45
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 549
Capıtulo 1
Introduccion
El principal objetivo de esta parte del curso de doctorado es dotar al alumno de lashabilidades necesarias para la manipulacion de herramientas informaticas que le permitanrealizar una labor investigadora eficaz
En el desarrollo de un proyecto informatico uno de los aspectos mas importantes esla eleccion del lenguaje mas apropiado para su implementacion y las herramientas a uti-lizar Existen multiples herramientas informaticas y multiples lenguajes de programaciondependiendo del area de estudio Una vez elegido el lenguaje se ha de recabar informacionsobre las herramientas disponibles y realizar un estudio acerca de cual se adapta mejora las necesidades del proyecto a realizar Ası pues es necesario iniciar al alumnado en eldesarrollo sistematico y ordenado de aplicaciones informaticas integradas en proyectos de
investigacion En este curso se especifican de forma generica las fases que componen eldesarrollo e implementacion de una aplicacion informatica y se formalizan las mismas conejemplos concretos de realizacion
Los objetivos concretos del curso son
Manejar los fundamentos basicos del sistema operativo UNIX (Linux)
Conocer las herramientas informaticas UNIX (Linux) fundamentales para el desa-rrollo de aplicaciones
Comprender los principios basicos de la programacion imperativa y oritentada aobjetos
Reconocer la importacia de la generacion de documentacion que acompana a todoproyecto informatico
Comprender como disenar algoritmos eficientes utilizando distintas tecnicas algorıtmi-cas
11 Desarrollo de aplicaciones Informaticas
En este apartado se expone de forma escueta cuales son las partes que constituyen eldesarrollo de un programa esto es las etapas de desarrollo de software
3
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 649
Herramientas y Lenguajes de Programacion 06-07 4
Figura 11 Etapas del desarrollo de software
Las etapas de desarrollo de software se pueden resumir en
1 Disenar una solucion proponiendo un algoritmo
2 Traduccir la solucion a pseudocodigo
3 Implementar un programa en un lenguaje de programacion (en el caso que estudia-remos Java)
4 Compilar el programa
5 Realizar pruebas de ejecucion
Aunque las etapas se presentan de forma secuencial es habitual cometer errores que
provoquen el tener que regresar a fases anteriores El esquema que se muestra en la Fi-gura 11 es valido para programas no demasiado complejos Para los grandes proyectosinformaticos exite un conjunto de tecnicas de desarrollo que pueden estudiarse en cualquierlibro de Ingenierıa del Software por ejemplo RS Pressman Ingenierıa del Software Unenfoque Pratico McGraw-Hill 4 edicion 1998 ISBN 84-481-1186-9
12 Herramientas
En el desarrollo de un proyecto informatico un aspecto importante es que tipo de he-rramientas se han de utilizar y el lenguaje mas apropiado para su implementacion Existen
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 749
Herramientas y Lenguajes de Programacion 06-07 5
multiples herramientas informaticas y multiples lenguajes de programacion dependiendo
del area de estudioEl sistema operativo elegido para realizar los ejercicios practico es este curso es Unix
(Linux) debido a la diponibilidad de gran cantidad de herramientas que facilitan al pro-gramador el desarrollo y mantenimiento de sus programas En este epıgrafe se hara unrepaso de algunas de la principales herramientas que existen en el entorno Unix para eldesarrollo de programas en el lenguaje de programacion Java Estas herramientas inclu-yen los compiladores - en los cuales se pueden encontrar diferencias segun la version Unixutilizada- los interpretes de la maquina virtual de Java (lınea de comandos - stand-aloneo herramientas de visualizacion - appletviewer ) la creacion de paquetes o bibliotecas etc
121 Proceso de Compilacion
Un traductor es un programa informatico que traduce de un lenguaje fuente a unlenguaje objeto
Un compilador es un traductor en el que el lenguaje fuente es un Lenguaje de Progra-macion de Alto Nivel y el lenguaje objeto es Lenguaje Ensamblador o Lenguaje MaquinaEl proceso de traduccion que tiene que realizar un compilador se puede dividir en lossiguientes pasos
Preprocesamiento
Compilacion (propiamente dicho) y Optimizacion
Generacion de Codigo Objeto
Enlace ( linker )
No es uno de los objetivos de este curso el estudiar en profundidad el proceso de com-pilacion sino utilizar las herramientas disponibles para llevarlo a cabo Para un estudio endetalle de los compiladores recomendamos el libro A Aho R Sethi J Ullman Compila-dores Principios Tecnicas y Herramientas Adisson-Wesley Iberoamericana ISBN 0-201-62903-8
La Figura 12 muestra el conjunto de herramientas que proporciona el paquete GCCde GNU para los compiladores de los lenguajes C y C++
El prepocesador ( cpp ) se invoca con el comando
g++ programaC -E -o programai
El compilador propiamente dicho ( comp ) se llama con la orden
g++ programaC -S -o programas
La llamada al ensamblador ( as ) utiliza la opcion -c
g++ programaC -c -o programao
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 849
Herramientas y Lenguajes de Programacion 06-07 6
Figura 12 Herramientas del compilador de GCC
El editor de carga y enlace (ld) se invoca automaticamente sin especificar ninguna
opciong++ programaC
Se obtiene el fichero aout que ya es ejecutable
Los ficheros intermedios generados se almacenan en tmp y se borran cuando terminatodo el proceso de compilacion
En el caso de Java se habla de un lenguaje de programaci on y de una plataformade ejecucion Como lenguaje de programacion de alto nivel se ha de destacar que escompletamente orientado a objetos y tiene definida una sintaxis y una semantica Laplataforma de ejecucion de Java esta compuesta por
La Maquina Virtual de Java (Java Virtual Machine - JVM)
Los APIs (Application Programming Interfaces - Paquetes)
122 Compilacion de programas formados por varios modulos
Consideremos la division de la implementacion de un problema CC++ en dos ficherosprograma1cc y programa2cc Segun se muestra en la Figura 13 el primer paso consisteen editar dichos ficheros (con el editor vi por ejemplo) A continuaci on la orden que sedeberıa emitir para generar la aplicacion es
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 949
Herramientas y Lenguajes de Programacion 06-07 7
Figura 13 Compilacion de varios modulos separados
g++ programa1c programa2c
Se ha de tener en cuenta que la llamada al enlazador (linker) se realiza de formaautomatica Por lo tanto los dos ficheros intermedios programa1o y programa2o seborraran al finalizar la operacion Si se quieren conservar ambos es necesario compilar conlos comandos
g++ -c programa1c
g++ -c programa2c
g++ programa1o programa2o
La procedencia de los ficheros que aporta el sistema operativo al proceso de compilaciones la siguiente
Ficheros de Cabecera - directorio usrinclude
Librerıas - directorios lib usrlib
123 Creacion de Librerıas
La creacion de librerıas (o bibliotecas) aporta modularidad y portabilidad a los pro-gramas
Una librerıa es un fichero que esta compuesto por una coleccion de otros ficheros lla-mados miembros de la librerıa La estructura de una librerıa posibilita la extraccion de
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1049
Herramientas y Lenguajes de Programacion 06-07 8
sus miembros Cuando se anade un fichero a una librerıa los datos de este y su informa-
cion administrativa (permisos fechas propietario grupo etc) se introduce en el Parauna descripcion detallada de las opciones de esta herrmienta visite la p agina de manual( man ar)
Las funciones basicas de ar son crear modificar y extraer miembros
ar [-] opciones [miembro] librerıa [ficheros]
Entre las opciones se deben distinguir aquellas que son obligatorias y los modificadoresCuando se emite una orden ar es necesario que haya una obligatoria y solo una
Los paquetes Java agrupan las clases en librerıas (bibliotecas) Los paquetes Java seutilizan de forma similar a como se utilizan las librerıas en C++ solo que en Java se
agrupan clases yo interfacesEn los paquetes las clases son unicas comparadas con las de otros paquetes y permi-
ten controlar el acceso Esto es los paquetes proporcionan una forma de ocultar clasesevitando que otros programas o paquetes accedan a clases que son de uso exclusivo de unaaplicacion determinada
Los paquetes se declaran utilizando la palabra reservada package seguida del nombredel paquete Esta sentencia debe estar al comienzo del fichero fuente Concretamente debeser la primera sentencia ejecutable del codigo Java excluyendo los comentarios y espaciosen blanco Por ejemplo
package figuras
public class Circulo
En este caso el nombre del paquete es figuras La clase Circulo se considera comoparte del paquete La inclusion de nuevas clases en el paquete es simple se ha de colocarla misma sentencia al comienzo de los ficheros que contengan la declaracion de las clasesCada uno de los ficheros que contengan clases pertenecientes a un mismo paquete debenincluir la misma sentencia package y solamente puede haber una sentencia package porfichero La sentencia package colocada el comienzo de un fichero fuente afectara a todaslas clases que se declaren en ese fichero
Se pueden referenciar paquetes precediendo con su nombre la clase que se quiere usar
Tambien se puede usar la palabra reservada import si se van a colocar multiples referenciasa un mismo paquete
La sentencia import se utiliza para incluir una lista de paquetes en los que buscar unaclase determinada y su sintaxis es
import nombre_paqueteNombre_Clase
Esta sentencia o grupo de ellas deben aparecer antes de cualquier declaracion de claseen el codigo fuente
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1149
Herramientas y Lenguajes de Programacion 06-07 9
124 Documentacion
La herramienta javadoc genera paginas HTML de documentacion del API a partir deficheros con codigo fuente Java
En la lınea de comandos se le puede pasar a javadoc una serie de paquetes o ficherosJava para los que se desea generar documentacion Se genera documentacion para el pa-quete especificado o para los ficheros fuentes Java individuales que se listen en la lınea decomandos Se genera un fichero html por cada fichero java que se encuentre Tambiense genera la jerarquıa de clases (treehtml) y un ındice con todos los miembros que hadetectado (AllNameshtml)
La utilidad javadoc extrae informacion de los siguiente elementos
Paquetes
Clases e interfaces publicas
Metodos publicos y protegidos
Datos publicos y protegidos
Se puede anadir documentacion para todos estos entes a traves de comentarios dedocumentacion en el codigo fuente Estos comentarios pueden incluir marcas HTML Uncomentario de documentacion esta formado por todos los caracteres incluidos entre queindica el comienzo del comentario y que indica el final En todas las lıneas intermediaslos caracteres a la izquierda se ignoran y tambien todos los espacios y tabuladores queprecedan a ese caracter
Este es un comentario de documentacion
Se pueden incluir etiquetas HTML dentro de un comentario de documentacion aunqueno deben utilizarse las etiquetas lth1gt lth2gt o lıneas horizontales lthrgt porque javadoc
crea una estructura completa para el documento y estas marcas interfieren con el formatogeneral de ese documento
Cada comentario de documentacion puede incluir texto libre seguido de etiquetas de
documentaciacute on Estas etiquetas comienzan siempre con el signo y deben situarse alprincipio de la lınea (tener en cuenta que todo lo que haya hasta el primer caracter se ignora) y todas las etiquetas con el mismo nombre deben agruparse juntas dentro delcomentario de documentacion
Marcas de documentacion de clases e interface
see nombre_de_clase
Anade un enlace a la clase especificada en la zona ldquoSee Alsordquo Por ejemplo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1249
Herramientas y Lenguajes de Programacion 06-07 10
see javalangString
see Stringsee Stringequals
see javalangObjectwaint(int)
see CharacterMAX_RADIX
see lta href=spechtmlgtEspecif Javaltagt
Se utiliza el caracter para separar el nombre de una clase del nombre de uno desus campos de datos metodos o constructores
version texto-version
Anade una entrada ldquoVersionrdquo El texto no tiene que tener formato especial
author texto-autor
Anade una entrada ldquoAuthorrdquo El texto no tiene que tener formato especial
since texto
Este texto no tiene una estructura especial Se utiliza para indicar desde que fechao desde que version se ha introducido el cambio o caracterıstica que indica el texto
deprecated texto
Anade un comentario indicando que el metodo esta desautorizado y no deberıa uti-lizarse porque puede dejar de ser soportada por el API La convencion que se siguees indicar en el texto la funcion o metodo por quien se ha sustituido Ejemplo decomentario de una clase
Clase que representa la figura geometrica cilindro
Por ejemplo
ltPREgt
Cilindro c = new Cilindro(10)
double d = cvolumen()
ltPREgt
see figurasCirculo
see figurasObjetoGeometrico
version 15 14 Mar 04
author Coromoto Leon Hernandez
public class Cilindro extends Circulo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1349
Herramientas y Lenguajes de Programacion 06-07 11
Marcas de documentacion de campos de datos
La unica marca especial que se puede incluir es la marca see Ejemplo de comentariode un campo de datos
El palo de bastos
public static final int BASTOS = 1
Marcas de documentacion de constructores y metodos
Pueden ser marcas see y ademas
param parametro descripcion
Anade un parametro a la seccion ldquoParametersrdquo La descripcion puede continuar enla lınea siguiente
return descripcion
Anade una seccion ldquoReturnrdquo que debe contener la descripcion del valor a devolver
throws exception descripcion
Anade una entrada ldquoThrowsrdquo que contiene el nombre de la excepcion que puede ser
lanzada por el metodo La excepcion estara enlazada con su clase en la documenta-cion
see nombre_de_clase
Anade un enlace a la clase en la zona ldquoSee Alsordquo
since texto
Indica desde que fecha o desde que version se ha introducido el cambio o caracterısticaque indica el texto
deprecated texto
Indica que no deberıa utilizarse el metodo porque esta desautorizado y puede dejarde ser soportado por el API en cualquier momento Ejemplo de comentario de unmetodo
Devuelve el caracter de la posicion indicada entre
ltttgt0ltttgt y ltttgtlength()-1ltttgt
param indice La posicion del caracter a obtener
return El caracter situado en la posicion
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1449
Herramientas y Lenguajes de Programacion 06-07 12
Figura 14 Evolucion de la metodologıa de programacion
exception StringIndexOutOfRangeException
Se prodcue cuando el indice no esta en el rango ltttgt0ltttgt a ltttgtlength()-1ltttgt
public char charAt( int indice )
13 Lenguajes de Programacion
El debate en este caso se centra en la programacion orientada a objetos frente a laprogramacion tradicional La Figura 14 muestra la evolucion de la metodologıa de la
programacion desde los primeros tiempos de la informatica hasta hoyEn la historia de la programacion ha habido varias evoluciones sucesivas Una de lasprincipales fue la programacion estructurada cuyo principio fundamental era dividir unprograma en subprogramas mas pequenos y faciles de resolver hasta llegar a niveles decomplejidad elementales siempre apoyandose en la idea de iquestQue debe hacer el programa
Este metodo de diseno a pesar de haber dado resultados satisfactorios tiene limita-ciones Algunas de ellas son
No favorece la reulitizacion del codigo
Si en la figura anterior fn1 y fn2 fueran identicas este hecho seguramente pasarıadesapercibido y no se compartirıa una unica funcion fn
Si dos subprogramas comparten una misma funcion fn reutilizando ası el codigo quedefine la misma y mas adelante queremos modificar fn porque hay un cambio enuno de los subprogramas que la utilizan la modificacion afectara tambien al otrosubprograma razon por la que ahora tendremos que realizar dos funciones
Por lo tanto se tiene que la programacion tradicional se desarrolla a partir de proce-dimientos y datos sin delimitar que procedimientos actuan sobre que datos
El diseno orientado a objetos se interesa en primer lugar por los datos a los que seasocian posteriormente procedimientos En este caso la idea principal es iquestde que trata el
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1549
Herramientas y Lenguajes de Programacion 06-07 13
programa Ası que el desarrollo se organiza en torno a los datos y no a como se debefuncionar
En la programacion orientada a objetos un programa es una coleccion de una solaentidad basica el objeto el cual combina los datos con los procedimientos que actuan
sobre ellos Durante la ejecucion los ob jetos reciben y envıan mensajes a otros objetospara ejecutar las acciones requeridas
La programacion orientada a objetos se puede llevar a cabo con lenguajes convenciona-les pero esto exige al programador la construccion de los mecanismos de que disponen loslenguajes orientados a objetos tales como objetos clases metodos mensajes herenciaetc
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1649
Herramientas y Lenguajes de Programacion 06-07 14
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1749
Capıtulo 2
Programas Java Aplicaciones
El objetivo de este ejercicio practico es mostrar el modo de funcionamiento de losdistintos tipos de programas Java En este caso se abordar an las aplicaciones
21 Ejemplo de aplicacion
El codigo que aparece a continuacion implementa en Java la aplicacion que muestraen la terminal la frase ldquoHola Mundo en Javardquo
1
2 Applicacion Simple3
4 class AplicacionSimple
5 public static void main(String[] args)
6 Systemoutprintln(Hola Mundo en Java)
7
8
El primer paso para manipular una aplicacion Java es compilarla ejecutando en la lıneade comandos la instruccion
gtjavac AplicacionSimplejava
Es importante que el nombre del fichero que contiene el c odigo coincida exactamentecon el nombre de la clase que aparece en la lınea numero 3
Al realizar este paso se obtiene un fichero AplicacionSimpleclass Para ejecutar la aplicacion escribimos en la lınea de comandos
gtjava AplicacionSimple
y obtenemos el resultado que aparece en la figura 21
15
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1849
Herramientas y Lenguajes de Programacion 06-07 16
Figura 21 Ejecucion de la aplicacion
22 Ejercicios
1 Compile y ejecute el ejemplo de aplicacion
2 Escriba una aplicacion Java que
Contemple la creacion de una clase (Clase1) que contengan un atributo enteroy metodos para establecer y recuperar los valores de dicho atributo
Definir una segunda clase (Clase2) con un atributo que es un objeto de la
Clase1 y con un metodo que establece diez valores diferentes en el atributo dela Clase1
Definir una tercera clase (Clase3) con un atributo que es un objeto de la Clase1
y con un metodo que recupera diez valores del atributo de la Clase1
Finalmente crear una clase de prueba donde se instancien objetos de las clasesanteriores y se invoque a sus metodos
3 Escriba la jerarquıa de clases del programa que ha desarrollado
4 Dibuje una traza del flujo de ejecucion de la aplicacion
5 Comente sus clases utilizando javadoc genere ficheros de descripcion de su clase
similares a los de la documentacion de las API de Java
En el documento de descripcion de la herramienta Javadoc puede encontrar la formade uso de las distintas etiquetas disponibles
see author version param return
(conexion a javasuncom )
Ejecute el comando javadoc desde la lınea de comandos sin ningun argumento yobtendra una lista de las opciones con las que puede llamar a la herramienta
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1949
Herramientas y Lenguajes de Programacion 06-07 17
Notese que para que aparezcan en el fichero html los comentarios asociados a los
campos de datos privados tiene que compilarlos con la opcion -privateDe la misma forma para que aparezcan el autor y la versi on se han de utilizar lasopciones -author y -version
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2049
Capıtulo 3
Programas Java applets
El objetivo de esta practica es mostrar el modo de funcionamiento de los distintos tiposde programas Java En esta practica se abordaran los applets
31 Ejemplo de applet
El codigo que aparece a continuacion muestra la implementacion en Java del programaque muestra en la ventana principal del navegador la frase ldquoHola Mundo en Javardquo
Applet Sencillo
import javaappletApplet
import javaawtGraphics
public class AppletSimple extends Applet
public void paint(Graphics g)
gdrawString(Hola Mundo en Java 50 25)
El primer paso para manipular un applet Java es compilarlo ejecutando en la lınea decomandos la instruccion
gtjavac AppletSimplejava
Al realizar este paso se obtiene una fichero AppletSimpleclassEl fichero class resultante de la compilacion se ha de incrustar en un fichero para
ser ejecutado por un navegadorEn este caso las etiquetas a utilizar son ltAPPLETgt y ltAPPLETgt
18
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 549
Capıtulo 1
Introduccion
El principal objetivo de esta parte del curso de doctorado es dotar al alumno de lashabilidades necesarias para la manipulacion de herramientas informaticas que le permitanrealizar una labor investigadora eficaz
En el desarrollo de un proyecto informatico uno de los aspectos mas importantes esla eleccion del lenguaje mas apropiado para su implementacion y las herramientas a uti-lizar Existen multiples herramientas informaticas y multiples lenguajes de programaciondependiendo del area de estudio Una vez elegido el lenguaje se ha de recabar informacionsobre las herramientas disponibles y realizar un estudio acerca de cual se adapta mejora las necesidades del proyecto a realizar Ası pues es necesario iniciar al alumnado en eldesarrollo sistematico y ordenado de aplicaciones informaticas integradas en proyectos de
investigacion En este curso se especifican de forma generica las fases que componen eldesarrollo e implementacion de una aplicacion informatica y se formalizan las mismas conejemplos concretos de realizacion
Los objetivos concretos del curso son
Manejar los fundamentos basicos del sistema operativo UNIX (Linux)
Conocer las herramientas informaticas UNIX (Linux) fundamentales para el desa-rrollo de aplicaciones
Comprender los principios basicos de la programacion imperativa y oritentada aobjetos
Reconocer la importacia de la generacion de documentacion que acompana a todoproyecto informatico
Comprender como disenar algoritmos eficientes utilizando distintas tecnicas algorıtmi-cas
11 Desarrollo de aplicaciones Informaticas
En este apartado se expone de forma escueta cuales son las partes que constituyen eldesarrollo de un programa esto es las etapas de desarrollo de software
3
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 649
Herramientas y Lenguajes de Programacion 06-07 4
Figura 11 Etapas del desarrollo de software
Las etapas de desarrollo de software se pueden resumir en
1 Disenar una solucion proponiendo un algoritmo
2 Traduccir la solucion a pseudocodigo
3 Implementar un programa en un lenguaje de programacion (en el caso que estudia-remos Java)
4 Compilar el programa
5 Realizar pruebas de ejecucion
Aunque las etapas se presentan de forma secuencial es habitual cometer errores que
provoquen el tener que regresar a fases anteriores El esquema que se muestra en la Fi-gura 11 es valido para programas no demasiado complejos Para los grandes proyectosinformaticos exite un conjunto de tecnicas de desarrollo que pueden estudiarse en cualquierlibro de Ingenierıa del Software por ejemplo RS Pressman Ingenierıa del Software Unenfoque Pratico McGraw-Hill 4 edicion 1998 ISBN 84-481-1186-9
12 Herramientas
En el desarrollo de un proyecto informatico un aspecto importante es que tipo de he-rramientas se han de utilizar y el lenguaje mas apropiado para su implementacion Existen
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 749
Herramientas y Lenguajes de Programacion 06-07 5
multiples herramientas informaticas y multiples lenguajes de programacion dependiendo
del area de estudioEl sistema operativo elegido para realizar los ejercicios practico es este curso es Unix
(Linux) debido a la diponibilidad de gran cantidad de herramientas que facilitan al pro-gramador el desarrollo y mantenimiento de sus programas En este epıgrafe se hara unrepaso de algunas de la principales herramientas que existen en el entorno Unix para eldesarrollo de programas en el lenguaje de programacion Java Estas herramientas inclu-yen los compiladores - en los cuales se pueden encontrar diferencias segun la version Unixutilizada- los interpretes de la maquina virtual de Java (lınea de comandos - stand-aloneo herramientas de visualizacion - appletviewer ) la creacion de paquetes o bibliotecas etc
121 Proceso de Compilacion
Un traductor es un programa informatico que traduce de un lenguaje fuente a unlenguaje objeto
Un compilador es un traductor en el que el lenguaje fuente es un Lenguaje de Progra-macion de Alto Nivel y el lenguaje objeto es Lenguaje Ensamblador o Lenguaje MaquinaEl proceso de traduccion que tiene que realizar un compilador se puede dividir en lossiguientes pasos
Preprocesamiento
Compilacion (propiamente dicho) y Optimizacion
Generacion de Codigo Objeto
Enlace ( linker )
No es uno de los objetivos de este curso el estudiar en profundidad el proceso de com-pilacion sino utilizar las herramientas disponibles para llevarlo a cabo Para un estudio endetalle de los compiladores recomendamos el libro A Aho R Sethi J Ullman Compila-dores Principios Tecnicas y Herramientas Adisson-Wesley Iberoamericana ISBN 0-201-62903-8
La Figura 12 muestra el conjunto de herramientas que proporciona el paquete GCCde GNU para los compiladores de los lenguajes C y C++
El prepocesador ( cpp ) se invoca con el comando
g++ programaC -E -o programai
El compilador propiamente dicho ( comp ) se llama con la orden
g++ programaC -S -o programas
La llamada al ensamblador ( as ) utiliza la opcion -c
g++ programaC -c -o programao
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 849
Herramientas y Lenguajes de Programacion 06-07 6
Figura 12 Herramientas del compilador de GCC
El editor de carga y enlace (ld) se invoca automaticamente sin especificar ninguna
opciong++ programaC
Se obtiene el fichero aout que ya es ejecutable
Los ficheros intermedios generados se almacenan en tmp y se borran cuando terminatodo el proceso de compilacion
En el caso de Java se habla de un lenguaje de programaci on y de una plataformade ejecucion Como lenguaje de programacion de alto nivel se ha de destacar que escompletamente orientado a objetos y tiene definida una sintaxis y una semantica Laplataforma de ejecucion de Java esta compuesta por
La Maquina Virtual de Java (Java Virtual Machine - JVM)
Los APIs (Application Programming Interfaces - Paquetes)
122 Compilacion de programas formados por varios modulos
Consideremos la division de la implementacion de un problema CC++ en dos ficherosprograma1cc y programa2cc Segun se muestra en la Figura 13 el primer paso consisteen editar dichos ficheros (con el editor vi por ejemplo) A continuaci on la orden que sedeberıa emitir para generar la aplicacion es
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 949
Herramientas y Lenguajes de Programacion 06-07 7
Figura 13 Compilacion de varios modulos separados
g++ programa1c programa2c
Se ha de tener en cuenta que la llamada al enlazador (linker) se realiza de formaautomatica Por lo tanto los dos ficheros intermedios programa1o y programa2o seborraran al finalizar la operacion Si se quieren conservar ambos es necesario compilar conlos comandos
g++ -c programa1c
g++ -c programa2c
g++ programa1o programa2o
La procedencia de los ficheros que aporta el sistema operativo al proceso de compilaciones la siguiente
Ficheros de Cabecera - directorio usrinclude
Librerıas - directorios lib usrlib
123 Creacion de Librerıas
La creacion de librerıas (o bibliotecas) aporta modularidad y portabilidad a los pro-gramas
Una librerıa es un fichero que esta compuesto por una coleccion de otros ficheros lla-mados miembros de la librerıa La estructura de una librerıa posibilita la extraccion de
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1049
Herramientas y Lenguajes de Programacion 06-07 8
sus miembros Cuando se anade un fichero a una librerıa los datos de este y su informa-
cion administrativa (permisos fechas propietario grupo etc) se introduce en el Parauna descripcion detallada de las opciones de esta herrmienta visite la p agina de manual( man ar)
Las funciones basicas de ar son crear modificar y extraer miembros
ar [-] opciones [miembro] librerıa [ficheros]
Entre las opciones se deben distinguir aquellas que son obligatorias y los modificadoresCuando se emite una orden ar es necesario que haya una obligatoria y solo una
Los paquetes Java agrupan las clases en librerıas (bibliotecas) Los paquetes Java seutilizan de forma similar a como se utilizan las librerıas en C++ solo que en Java se
agrupan clases yo interfacesEn los paquetes las clases son unicas comparadas con las de otros paquetes y permi-
ten controlar el acceso Esto es los paquetes proporcionan una forma de ocultar clasesevitando que otros programas o paquetes accedan a clases que son de uso exclusivo de unaaplicacion determinada
Los paquetes se declaran utilizando la palabra reservada package seguida del nombredel paquete Esta sentencia debe estar al comienzo del fichero fuente Concretamente debeser la primera sentencia ejecutable del codigo Java excluyendo los comentarios y espaciosen blanco Por ejemplo
package figuras
public class Circulo
En este caso el nombre del paquete es figuras La clase Circulo se considera comoparte del paquete La inclusion de nuevas clases en el paquete es simple se ha de colocarla misma sentencia al comienzo de los ficheros que contengan la declaracion de las clasesCada uno de los ficheros que contengan clases pertenecientes a un mismo paquete debenincluir la misma sentencia package y solamente puede haber una sentencia package porfichero La sentencia package colocada el comienzo de un fichero fuente afectara a todaslas clases que se declaren en ese fichero
Se pueden referenciar paquetes precediendo con su nombre la clase que se quiere usar
Tambien se puede usar la palabra reservada import si se van a colocar multiples referenciasa un mismo paquete
La sentencia import se utiliza para incluir una lista de paquetes en los que buscar unaclase determinada y su sintaxis es
import nombre_paqueteNombre_Clase
Esta sentencia o grupo de ellas deben aparecer antes de cualquier declaracion de claseen el codigo fuente
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1149
Herramientas y Lenguajes de Programacion 06-07 9
124 Documentacion
La herramienta javadoc genera paginas HTML de documentacion del API a partir deficheros con codigo fuente Java
En la lınea de comandos se le puede pasar a javadoc una serie de paquetes o ficherosJava para los que se desea generar documentacion Se genera documentacion para el pa-quete especificado o para los ficheros fuentes Java individuales que se listen en la lınea decomandos Se genera un fichero html por cada fichero java que se encuentre Tambiense genera la jerarquıa de clases (treehtml) y un ındice con todos los miembros que hadetectado (AllNameshtml)
La utilidad javadoc extrae informacion de los siguiente elementos
Paquetes
Clases e interfaces publicas
Metodos publicos y protegidos
Datos publicos y protegidos
Se puede anadir documentacion para todos estos entes a traves de comentarios dedocumentacion en el codigo fuente Estos comentarios pueden incluir marcas HTML Uncomentario de documentacion esta formado por todos los caracteres incluidos entre queindica el comienzo del comentario y que indica el final En todas las lıneas intermediaslos caracteres a la izquierda se ignoran y tambien todos los espacios y tabuladores queprecedan a ese caracter
Este es un comentario de documentacion
Se pueden incluir etiquetas HTML dentro de un comentario de documentacion aunqueno deben utilizarse las etiquetas lth1gt lth2gt o lıneas horizontales lthrgt porque javadoc
crea una estructura completa para el documento y estas marcas interfieren con el formatogeneral de ese documento
Cada comentario de documentacion puede incluir texto libre seguido de etiquetas de
documentaciacute on Estas etiquetas comienzan siempre con el signo y deben situarse alprincipio de la lınea (tener en cuenta que todo lo que haya hasta el primer caracter se ignora) y todas las etiquetas con el mismo nombre deben agruparse juntas dentro delcomentario de documentacion
Marcas de documentacion de clases e interface
see nombre_de_clase
Anade un enlace a la clase especificada en la zona ldquoSee Alsordquo Por ejemplo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1249
Herramientas y Lenguajes de Programacion 06-07 10
see javalangString
see Stringsee Stringequals
see javalangObjectwaint(int)
see CharacterMAX_RADIX
see lta href=spechtmlgtEspecif Javaltagt
Se utiliza el caracter para separar el nombre de una clase del nombre de uno desus campos de datos metodos o constructores
version texto-version
Anade una entrada ldquoVersionrdquo El texto no tiene que tener formato especial
author texto-autor
Anade una entrada ldquoAuthorrdquo El texto no tiene que tener formato especial
since texto
Este texto no tiene una estructura especial Se utiliza para indicar desde que fechao desde que version se ha introducido el cambio o caracterıstica que indica el texto
deprecated texto
Anade un comentario indicando que el metodo esta desautorizado y no deberıa uti-lizarse porque puede dejar de ser soportada por el API La convencion que se siguees indicar en el texto la funcion o metodo por quien se ha sustituido Ejemplo decomentario de una clase
Clase que representa la figura geometrica cilindro
Por ejemplo
ltPREgt
Cilindro c = new Cilindro(10)
double d = cvolumen()
ltPREgt
see figurasCirculo
see figurasObjetoGeometrico
version 15 14 Mar 04
author Coromoto Leon Hernandez
public class Cilindro extends Circulo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1349
Herramientas y Lenguajes de Programacion 06-07 11
Marcas de documentacion de campos de datos
La unica marca especial que se puede incluir es la marca see Ejemplo de comentariode un campo de datos
El palo de bastos
public static final int BASTOS = 1
Marcas de documentacion de constructores y metodos
Pueden ser marcas see y ademas
param parametro descripcion
Anade un parametro a la seccion ldquoParametersrdquo La descripcion puede continuar enla lınea siguiente
return descripcion
Anade una seccion ldquoReturnrdquo que debe contener la descripcion del valor a devolver
throws exception descripcion
Anade una entrada ldquoThrowsrdquo que contiene el nombre de la excepcion que puede ser
lanzada por el metodo La excepcion estara enlazada con su clase en la documenta-cion
see nombre_de_clase
Anade un enlace a la clase en la zona ldquoSee Alsordquo
since texto
Indica desde que fecha o desde que version se ha introducido el cambio o caracterısticaque indica el texto
deprecated texto
Indica que no deberıa utilizarse el metodo porque esta desautorizado y puede dejarde ser soportado por el API en cualquier momento Ejemplo de comentario de unmetodo
Devuelve el caracter de la posicion indicada entre
ltttgt0ltttgt y ltttgtlength()-1ltttgt
param indice La posicion del caracter a obtener
return El caracter situado en la posicion
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1449
Herramientas y Lenguajes de Programacion 06-07 12
Figura 14 Evolucion de la metodologıa de programacion
exception StringIndexOutOfRangeException
Se prodcue cuando el indice no esta en el rango ltttgt0ltttgt a ltttgtlength()-1ltttgt
public char charAt( int indice )
13 Lenguajes de Programacion
El debate en este caso se centra en la programacion orientada a objetos frente a laprogramacion tradicional La Figura 14 muestra la evolucion de la metodologıa de la
programacion desde los primeros tiempos de la informatica hasta hoyEn la historia de la programacion ha habido varias evoluciones sucesivas Una de lasprincipales fue la programacion estructurada cuyo principio fundamental era dividir unprograma en subprogramas mas pequenos y faciles de resolver hasta llegar a niveles decomplejidad elementales siempre apoyandose en la idea de iquestQue debe hacer el programa
Este metodo de diseno a pesar de haber dado resultados satisfactorios tiene limita-ciones Algunas de ellas son
No favorece la reulitizacion del codigo
Si en la figura anterior fn1 y fn2 fueran identicas este hecho seguramente pasarıadesapercibido y no se compartirıa una unica funcion fn
Si dos subprogramas comparten una misma funcion fn reutilizando ası el codigo quedefine la misma y mas adelante queremos modificar fn porque hay un cambio enuno de los subprogramas que la utilizan la modificacion afectara tambien al otrosubprograma razon por la que ahora tendremos que realizar dos funciones
Por lo tanto se tiene que la programacion tradicional se desarrolla a partir de proce-dimientos y datos sin delimitar que procedimientos actuan sobre que datos
El diseno orientado a objetos se interesa en primer lugar por los datos a los que seasocian posteriormente procedimientos En este caso la idea principal es iquestde que trata el
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1549
Herramientas y Lenguajes de Programacion 06-07 13
programa Ası que el desarrollo se organiza en torno a los datos y no a como se debefuncionar
En la programacion orientada a objetos un programa es una coleccion de una solaentidad basica el objeto el cual combina los datos con los procedimientos que actuan
sobre ellos Durante la ejecucion los ob jetos reciben y envıan mensajes a otros objetospara ejecutar las acciones requeridas
La programacion orientada a objetos se puede llevar a cabo con lenguajes convenciona-les pero esto exige al programador la construccion de los mecanismos de que disponen loslenguajes orientados a objetos tales como objetos clases metodos mensajes herenciaetc
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1649
Herramientas y Lenguajes de Programacion 06-07 14
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1749
Capıtulo 2
Programas Java Aplicaciones
El objetivo de este ejercicio practico es mostrar el modo de funcionamiento de losdistintos tipos de programas Java En este caso se abordar an las aplicaciones
21 Ejemplo de aplicacion
El codigo que aparece a continuacion implementa en Java la aplicacion que muestraen la terminal la frase ldquoHola Mundo en Javardquo
1
2 Applicacion Simple3
4 class AplicacionSimple
5 public static void main(String[] args)
6 Systemoutprintln(Hola Mundo en Java)
7
8
El primer paso para manipular una aplicacion Java es compilarla ejecutando en la lıneade comandos la instruccion
gtjavac AplicacionSimplejava
Es importante que el nombre del fichero que contiene el c odigo coincida exactamentecon el nombre de la clase que aparece en la lınea numero 3
Al realizar este paso se obtiene un fichero AplicacionSimpleclass Para ejecutar la aplicacion escribimos en la lınea de comandos
gtjava AplicacionSimple
y obtenemos el resultado que aparece en la figura 21
15
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1849
Herramientas y Lenguajes de Programacion 06-07 16
Figura 21 Ejecucion de la aplicacion
22 Ejercicios
1 Compile y ejecute el ejemplo de aplicacion
2 Escriba una aplicacion Java que
Contemple la creacion de una clase (Clase1) que contengan un atributo enteroy metodos para establecer y recuperar los valores de dicho atributo
Definir una segunda clase (Clase2) con un atributo que es un objeto de la
Clase1 y con un metodo que establece diez valores diferentes en el atributo dela Clase1
Definir una tercera clase (Clase3) con un atributo que es un objeto de la Clase1
y con un metodo que recupera diez valores del atributo de la Clase1
Finalmente crear una clase de prueba donde se instancien objetos de las clasesanteriores y se invoque a sus metodos
3 Escriba la jerarquıa de clases del programa que ha desarrollado
4 Dibuje una traza del flujo de ejecucion de la aplicacion
5 Comente sus clases utilizando javadoc genere ficheros de descripcion de su clase
similares a los de la documentacion de las API de Java
En el documento de descripcion de la herramienta Javadoc puede encontrar la formade uso de las distintas etiquetas disponibles
see author version param return
(conexion a javasuncom )
Ejecute el comando javadoc desde la lınea de comandos sin ningun argumento yobtendra una lista de las opciones con las que puede llamar a la herramienta
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1949
Herramientas y Lenguajes de Programacion 06-07 17
Notese que para que aparezcan en el fichero html los comentarios asociados a los
campos de datos privados tiene que compilarlos con la opcion -privateDe la misma forma para que aparezcan el autor y la versi on se han de utilizar lasopciones -author y -version
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2049
Capıtulo 3
Programas Java applets
El objetivo de esta practica es mostrar el modo de funcionamiento de los distintos tiposde programas Java En esta practica se abordaran los applets
31 Ejemplo de applet
El codigo que aparece a continuacion muestra la implementacion en Java del programaque muestra en la ventana principal del navegador la frase ldquoHola Mundo en Javardquo
Applet Sencillo
import javaappletApplet
import javaawtGraphics
public class AppletSimple extends Applet
public void paint(Graphics g)
gdrawString(Hola Mundo en Java 50 25)
El primer paso para manipular un applet Java es compilarlo ejecutando en la lınea decomandos la instruccion
gtjavac AppletSimplejava
Al realizar este paso se obtiene una fichero AppletSimpleclassEl fichero class resultante de la compilacion se ha de incrustar en un fichero para
ser ejecutado por un navegadorEn este caso las etiquetas a utilizar son ltAPPLETgt y ltAPPLETgt
18
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 649
Herramientas y Lenguajes de Programacion 06-07 4
Figura 11 Etapas del desarrollo de software
Las etapas de desarrollo de software se pueden resumir en
1 Disenar una solucion proponiendo un algoritmo
2 Traduccir la solucion a pseudocodigo
3 Implementar un programa en un lenguaje de programacion (en el caso que estudia-remos Java)
4 Compilar el programa
5 Realizar pruebas de ejecucion
Aunque las etapas se presentan de forma secuencial es habitual cometer errores que
provoquen el tener que regresar a fases anteriores El esquema que se muestra en la Fi-gura 11 es valido para programas no demasiado complejos Para los grandes proyectosinformaticos exite un conjunto de tecnicas de desarrollo que pueden estudiarse en cualquierlibro de Ingenierıa del Software por ejemplo RS Pressman Ingenierıa del Software Unenfoque Pratico McGraw-Hill 4 edicion 1998 ISBN 84-481-1186-9
12 Herramientas
En el desarrollo de un proyecto informatico un aspecto importante es que tipo de he-rramientas se han de utilizar y el lenguaje mas apropiado para su implementacion Existen
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 749
Herramientas y Lenguajes de Programacion 06-07 5
multiples herramientas informaticas y multiples lenguajes de programacion dependiendo
del area de estudioEl sistema operativo elegido para realizar los ejercicios practico es este curso es Unix
(Linux) debido a la diponibilidad de gran cantidad de herramientas que facilitan al pro-gramador el desarrollo y mantenimiento de sus programas En este epıgrafe se hara unrepaso de algunas de la principales herramientas que existen en el entorno Unix para eldesarrollo de programas en el lenguaje de programacion Java Estas herramientas inclu-yen los compiladores - en los cuales se pueden encontrar diferencias segun la version Unixutilizada- los interpretes de la maquina virtual de Java (lınea de comandos - stand-aloneo herramientas de visualizacion - appletviewer ) la creacion de paquetes o bibliotecas etc
121 Proceso de Compilacion
Un traductor es un programa informatico que traduce de un lenguaje fuente a unlenguaje objeto
Un compilador es un traductor en el que el lenguaje fuente es un Lenguaje de Progra-macion de Alto Nivel y el lenguaje objeto es Lenguaje Ensamblador o Lenguaje MaquinaEl proceso de traduccion que tiene que realizar un compilador se puede dividir en lossiguientes pasos
Preprocesamiento
Compilacion (propiamente dicho) y Optimizacion
Generacion de Codigo Objeto
Enlace ( linker )
No es uno de los objetivos de este curso el estudiar en profundidad el proceso de com-pilacion sino utilizar las herramientas disponibles para llevarlo a cabo Para un estudio endetalle de los compiladores recomendamos el libro A Aho R Sethi J Ullman Compila-dores Principios Tecnicas y Herramientas Adisson-Wesley Iberoamericana ISBN 0-201-62903-8
La Figura 12 muestra el conjunto de herramientas que proporciona el paquete GCCde GNU para los compiladores de los lenguajes C y C++
El prepocesador ( cpp ) se invoca con el comando
g++ programaC -E -o programai
El compilador propiamente dicho ( comp ) se llama con la orden
g++ programaC -S -o programas
La llamada al ensamblador ( as ) utiliza la opcion -c
g++ programaC -c -o programao
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 849
Herramientas y Lenguajes de Programacion 06-07 6
Figura 12 Herramientas del compilador de GCC
El editor de carga y enlace (ld) se invoca automaticamente sin especificar ninguna
opciong++ programaC
Se obtiene el fichero aout que ya es ejecutable
Los ficheros intermedios generados se almacenan en tmp y se borran cuando terminatodo el proceso de compilacion
En el caso de Java se habla de un lenguaje de programaci on y de una plataformade ejecucion Como lenguaje de programacion de alto nivel se ha de destacar que escompletamente orientado a objetos y tiene definida una sintaxis y una semantica Laplataforma de ejecucion de Java esta compuesta por
La Maquina Virtual de Java (Java Virtual Machine - JVM)
Los APIs (Application Programming Interfaces - Paquetes)
122 Compilacion de programas formados por varios modulos
Consideremos la division de la implementacion de un problema CC++ en dos ficherosprograma1cc y programa2cc Segun se muestra en la Figura 13 el primer paso consisteen editar dichos ficheros (con el editor vi por ejemplo) A continuaci on la orden que sedeberıa emitir para generar la aplicacion es
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 949
Herramientas y Lenguajes de Programacion 06-07 7
Figura 13 Compilacion de varios modulos separados
g++ programa1c programa2c
Se ha de tener en cuenta que la llamada al enlazador (linker) se realiza de formaautomatica Por lo tanto los dos ficheros intermedios programa1o y programa2o seborraran al finalizar la operacion Si se quieren conservar ambos es necesario compilar conlos comandos
g++ -c programa1c
g++ -c programa2c
g++ programa1o programa2o
La procedencia de los ficheros que aporta el sistema operativo al proceso de compilaciones la siguiente
Ficheros de Cabecera - directorio usrinclude
Librerıas - directorios lib usrlib
123 Creacion de Librerıas
La creacion de librerıas (o bibliotecas) aporta modularidad y portabilidad a los pro-gramas
Una librerıa es un fichero que esta compuesto por una coleccion de otros ficheros lla-mados miembros de la librerıa La estructura de una librerıa posibilita la extraccion de
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1049
Herramientas y Lenguajes de Programacion 06-07 8
sus miembros Cuando se anade un fichero a una librerıa los datos de este y su informa-
cion administrativa (permisos fechas propietario grupo etc) se introduce en el Parauna descripcion detallada de las opciones de esta herrmienta visite la p agina de manual( man ar)
Las funciones basicas de ar son crear modificar y extraer miembros
ar [-] opciones [miembro] librerıa [ficheros]
Entre las opciones se deben distinguir aquellas que son obligatorias y los modificadoresCuando se emite una orden ar es necesario que haya una obligatoria y solo una
Los paquetes Java agrupan las clases en librerıas (bibliotecas) Los paquetes Java seutilizan de forma similar a como se utilizan las librerıas en C++ solo que en Java se
agrupan clases yo interfacesEn los paquetes las clases son unicas comparadas con las de otros paquetes y permi-
ten controlar el acceso Esto es los paquetes proporcionan una forma de ocultar clasesevitando que otros programas o paquetes accedan a clases que son de uso exclusivo de unaaplicacion determinada
Los paquetes se declaran utilizando la palabra reservada package seguida del nombredel paquete Esta sentencia debe estar al comienzo del fichero fuente Concretamente debeser la primera sentencia ejecutable del codigo Java excluyendo los comentarios y espaciosen blanco Por ejemplo
package figuras
public class Circulo
En este caso el nombre del paquete es figuras La clase Circulo se considera comoparte del paquete La inclusion de nuevas clases en el paquete es simple se ha de colocarla misma sentencia al comienzo de los ficheros que contengan la declaracion de las clasesCada uno de los ficheros que contengan clases pertenecientes a un mismo paquete debenincluir la misma sentencia package y solamente puede haber una sentencia package porfichero La sentencia package colocada el comienzo de un fichero fuente afectara a todaslas clases que se declaren en ese fichero
Se pueden referenciar paquetes precediendo con su nombre la clase que se quiere usar
Tambien se puede usar la palabra reservada import si se van a colocar multiples referenciasa un mismo paquete
La sentencia import se utiliza para incluir una lista de paquetes en los que buscar unaclase determinada y su sintaxis es
import nombre_paqueteNombre_Clase
Esta sentencia o grupo de ellas deben aparecer antes de cualquier declaracion de claseen el codigo fuente
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1149
Herramientas y Lenguajes de Programacion 06-07 9
124 Documentacion
La herramienta javadoc genera paginas HTML de documentacion del API a partir deficheros con codigo fuente Java
En la lınea de comandos se le puede pasar a javadoc una serie de paquetes o ficherosJava para los que se desea generar documentacion Se genera documentacion para el pa-quete especificado o para los ficheros fuentes Java individuales que se listen en la lınea decomandos Se genera un fichero html por cada fichero java que se encuentre Tambiense genera la jerarquıa de clases (treehtml) y un ındice con todos los miembros que hadetectado (AllNameshtml)
La utilidad javadoc extrae informacion de los siguiente elementos
Paquetes
Clases e interfaces publicas
Metodos publicos y protegidos
Datos publicos y protegidos
Se puede anadir documentacion para todos estos entes a traves de comentarios dedocumentacion en el codigo fuente Estos comentarios pueden incluir marcas HTML Uncomentario de documentacion esta formado por todos los caracteres incluidos entre queindica el comienzo del comentario y que indica el final En todas las lıneas intermediaslos caracteres a la izquierda se ignoran y tambien todos los espacios y tabuladores queprecedan a ese caracter
Este es un comentario de documentacion
Se pueden incluir etiquetas HTML dentro de un comentario de documentacion aunqueno deben utilizarse las etiquetas lth1gt lth2gt o lıneas horizontales lthrgt porque javadoc
crea una estructura completa para el documento y estas marcas interfieren con el formatogeneral de ese documento
Cada comentario de documentacion puede incluir texto libre seguido de etiquetas de
documentaciacute on Estas etiquetas comienzan siempre con el signo y deben situarse alprincipio de la lınea (tener en cuenta que todo lo que haya hasta el primer caracter se ignora) y todas las etiquetas con el mismo nombre deben agruparse juntas dentro delcomentario de documentacion
Marcas de documentacion de clases e interface
see nombre_de_clase
Anade un enlace a la clase especificada en la zona ldquoSee Alsordquo Por ejemplo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1249
Herramientas y Lenguajes de Programacion 06-07 10
see javalangString
see Stringsee Stringequals
see javalangObjectwaint(int)
see CharacterMAX_RADIX
see lta href=spechtmlgtEspecif Javaltagt
Se utiliza el caracter para separar el nombre de una clase del nombre de uno desus campos de datos metodos o constructores
version texto-version
Anade una entrada ldquoVersionrdquo El texto no tiene que tener formato especial
author texto-autor
Anade una entrada ldquoAuthorrdquo El texto no tiene que tener formato especial
since texto
Este texto no tiene una estructura especial Se utiliza para indicar desde que fechao desde que version se ha introducido el cambio o caracterıstica que indica el texto
deprecated texto
Anade un comentario indicando que el metodo esta desautorizado y no deberıa uti-lizarse porque puede dejar de ser soportada por el API La convencion que se siguees indicar en el texto la funcion o metodo por quien se ha sustituido Ejemplo decomentario de una clase
Clase que representa la figura geometrica cilindro
Por ejemplo
ltPREgt
Cilindro c = new Cilindro(10)
double d = cvolumen()
ltPREgt
see figurasCirculo
see figurasObjetoGeometrico
version 15 14 Mar 04
author Coromoto Leon Hernandez
public class Cilindro extends Circulo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1349
Herramientas y Lenguajes de Programacion 06-07 11
Marcas de documentacion de campos de datos
La unica marca especial que se puede incluir es la marca see Ejemplo de comentariode un campo de datos
El palo de bastos
public static final int BASTOS = 1
Marcas de documentacion de constructores y metodos
Pueden ser marcas see y ademas
param parametro descripcion
Anade un parametro a la seccion ldquoParametersrdquo La descripcion puede continuar enla lınea siguiente
return descripcion
Anade una seccion ldquoReturnrdquo que debe contener la descripcion del valor a devolver
throws exception descripcion
Anade una entrada ldquoThrowsrdquo que contiene el nombre de la excepcion que puede ser
lanzada por el metodo La excepcion estara enlazada con su clase en la documenta-cion
see nombre_de_clase
Anade un enlace a la clase en la zona ldquoSee Alsordquo
since texto
Indica desde que fecha o desde que version se ha introducido el cambio o caracterısticaque indica el texto
deprecated texto
Indica que no deberıa utilizarse el metodo porque esta desautorizado y puede dejarde ser soportado por el API en cualquier momento Ejemplo de comentario de unmetodo
Devuelve el caracter de la posicion indicada entre
ltttgt0ltttgt y ltttgtlength()-1ltttgt
param indice La posicion del caracter a obtener
return El caracter situado en la posicion
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1449
Herramientas y Lenguajes de Programacion 06-07 12
Figura 14 Evolucion de la metodologıa de programacion
exception StringIndexOutOfRangeException
Se prodcue cuando el indice no esta en el rango ltttgt0ltttgt a ltttgtlength()-1ltttgt
public char charAt( int indice )
13 Lenguajes de Programacion
El debate en este caso se centra en la programacion orientada a objetos frente a laprogramacion tradicional La Figura 14 muestra la evolucion de la metodologıa de la
programacion desde los primeros tiempos de la informatica hasta hoyEn la historia de la programacion ha habido varias evoluciones sucesivas Una de lasprincipales fue la programacion estructurada cuyo principio fundamental era dividir unprograma en subprogramas mas pequenos y faciles de resolver hasta llegar a niveles decomplejidad elementales siempre apoyandose en la idea de iquestQue debe hacer el programa
Este metodo de diseno a pesar de haber dado resultados satisfactorios tiene limita-ciones Algunas de ellas son
No favorece la reulitizacion del codigo
Si en la figura anterior fn1 y fn2 fueran identicas este hecho seguramente pasarıadesapercibido y no se compartirıa una unica funcion fn
Si dos subprogramas comparten una misma funcion fn reutilizando ası el codigo quedefine la misma y mas adelante queremos modificar fn porque hay un cambio enuno de los subprogramas que la utilizan la modificacion afectara tambien al otrosubprograma razon por la que ahora tendremos que realizar dos funciones
Por lo tanto se tiene que la programacion tradicional se desarrolla a partir de proce-dimientos y datos sin delimitar que procedimientos actuan sobre que datos
El diseno orientado a objetos se interesa en primer lugar por los datos a los que seasocian posteriormente procedimientos En este caso la idea principal es iquestde que trata el
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1549
Herramientas y Lenguajes de Programacion 06-07 13
programa Ası que el desarrollo se organiza en torno a los datos y no a como se debefuncionar
En la programacion orientada a objetos un programa es una coleccion de una solaentidad basica el objeto el cual combina los datos con los procedimientos que actuan
sobre ellos Durante la ejecucion los ob jetos reciben y envıan mensajes a otros objetospara ejecutar las acciones requeridas
La programacion orientada a objetos se puede llevar a cabo con lenguajes convenciona-les pero esto exige al programador la construccion de los mecanismos de que disponen loslenguajes orientados a objetos tales como objetos clases metodos mensajes herenciaetc
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1649
Herramientas y Lenguajes de Programacion 06-07 14
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1749
Capıtulo 2
Programas Java Aplicaciones
El objetivo de este ejercicio practico es mostrar el modo de funcionamiento de losdistintos tipos de programas Java En este caso se abordar an las aplicaciones
21 Ejemplo de aplicacion
El codigo que aparece a continuacion implementa en Java la aplicacion que muestraen la terminal la frase ldquoHola Mundo en Javardquo
1
2 Applicacion Simple3
4 class AplicacionSimple
5 public static void main(String[] args)
6 Systemoutprintln(Hola Mundo en Java)
7
8
El primer paso para manipular una aplicacion Java es compilarla ejecutando en la lıneade comandos la instruccion
gtjavac AplicacionSimplejava
Es importante que el nombre del fichero que contiene el c odigo coincida exactamentecon el nombre de la clase que aparece en la lınea numero 3
Al realizar este paso se obtiene un fichero AplicacionSimpleclass Para ejecutar la aplicacion escribimos en la lınea de comandos
gtjava AplicacionSimple
y obtenemos el resultado que aparece en la figura 21
15
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1849
Herramientas y Lenguajes de Programacion 06-07 16
Figura 21 Ejecucion de la aplicacion
22 Ejercicios
1 Compile y ejecute el ejemplo de aplicacion
2 Escriba una aplicacion Java que
Contemple la creacion de una clase (Clase1) que contengan un atributo enteroy metodos para establecer y recuperar los valores de dicho atributo
Definir una segunda clase (Clase2) con un atributo que es un objeto de la
Clase1 y con un metodo que establece diez valores diferentes en el atributo dela Clase1
Definir una tercera clase (Clase3) con un atributo que es un objeto de la Clase1
y con un metodo que recupera diez valores del atributo de la Clase1
Finalmente crear una clase de prueba donde se instancien objetos de las clasesanteriores y se invoque a sus metodos
3 Escriba la jerarquıa de clases del programa que ha desarrollado
4 Dibuje una traza del flujo de ejecucion de la aplicacion
5 Comente sus clases utilizando javadoc genere ficheros de descripcion de su clase
similares a los de la documentacion de las API de Java
En el documento de descripcion de la herramienta Javadoc puede encontrar la formade uso de las distintas etiquetas disponibles
see author version param return
(conexion a javasuncom )
Ejecute el comando javadoc desde la lınea de comandos sin ningun argumento yobtendra una lista de las opciones con las que puede llamar a la herramienta
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1949
Herramientas y Lenguajes de Programacion 06-07 17
Notese que para que aparezcan en el fichero html los comentarios asociados a los
campos de datos privados tiene que compilarlos con la opcion -privateDe la misma forma para que aparezcan el autor y la versi on se han de utilizar lasopciones -author y -version
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2049
Capıtulo 3
Programas Java applets
El objetivo de esta practica es mostrar el modo de funcionamiento de los distintos tiposde programas Java En esta practica se abordaran los applets
31 Ejemplo de applet
El codigo que aparece a continuacion muestra la implementacion en Java del programaque muestra en la ventana principal del navegador la frase ldquoHola Mundo en Javardquo
Applet Sencillo
import javaappletApplet
import javaawtGraphics
public class AppletSimple extends Applet
public void paint(Graphics g)
gdrawString(Hola Mundo en Java 50 25)
El primer paso para manipular un applet Java es compilarlo ejecutando en la lınea decomandos la instruccion
gtjavac AppletSimplejava
Al realizar este paso se obtiene una fichero AppletSimpleclassEl fichero class resultante de la compilacion se ha de incrustar en un fichero para
ser ejecutado por un navegadorEn este caso las etiquetas a utilizar son ltAPPLETgt y ltAPPLETgt
18
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 749
Herramientas y Lenguajes de Programacion 06-07 5
multiples herramientas informaticas y multiples lenguajes de programacion dependiendo
del area de estudioEl sistema operativo elegido para realizar los ejercicios practico es este curso es Unix
(Linux) debido a la diponibilidad de gran cantidad de herramientas que facilitan al pro-gramador el desarrollo y mantenimiento de sus programas En este epıgrafe se hara unrepaso de algunas de la principales herramientas que existen en el entorno Unix para eldesarrollo de programas en el lenguaje de programacion Java Estas herramientas inclu-yen los compiladores - en los cuales se pueden encontrar diferencias segun la version Unixutilizada- los interpretes de la maquina virtual de Java (lınea de comandos - stand-aloneo herramientas de visualizacion - appletviewer ) la creacion de paquetes o bibliotecas etc
121 Proceso de Compilacion
Un traductor es un programa informatico que traduce de un lenguaje fuente a unlenguaje objeto
Un compilador es un traductor en el que el lenguaje fuente es un Lenguaje de Progra-macion de Alto Nivel y el lenguaje objeto es Lenguaje Ensamblador o Lenguaje MaquinaEl proceso de traduccion que tiene que realizar un compilador se puede dividir en lossiguientes pasos
Preprocesamiento
Compilacion (propiamente dicho) y Optimizacion
Generacion de Codigo Objeto
Enlace ( linker )
No es uno de los objetivos de este curso el estudiar en profundidad el proceso de com-pilacion sino utilizar las herramientas disponibles para llevarlo a cabo Para un estudio endetalle de los compiladores recomendamos el libro A Aho R Sethi J Ullman Compila-dores Principios Tecnicas y Herramientas Adisson-Wesley Iberoamericana ISBN 0-201-62903-8
La Figura 12 muestra el conjunto de herramientas que proporciona el paquete GCCde GNU para los compiladores de los lenguajes C y C++
El prepocesador ( cpp ) se invoca con el comando
g++ programaC -E -o programai
El compilador propiamente dicho ( comp ) se llama con la orden
g++ programaC -S -o programas
La llamada al ensamblador ( as ) utiliza la opcion -c
g++ programaC -c -o programao
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 849
Herramientas y Lenguajes de Programacion 06-07 6
Figura 12 Herramientas del compilador de GCC
El editor de carga y enlace (ld) se invoca automaticamente sin especificar ninguna
opciong++ programaC
Se obtiene el fichero aout que ya es ejecutable
Los ficheros intermedios generados se almacenan en tmp y se borran cuando terminatodo el proceso de compilacion
En el caso de Java se habla de un lenguaje de programaci on y de una plataformade ejecucion Como lenguaje de programacion de alto nivel se ha de destacar que escompletamente orientado a objetos y tiene definida una sintaxis y una semantica Laplataforma de ejecucion de Java esta compuesta por
La Maquina Virtual de Java (Java Virtual Machine - JVM)
Los APIs (Application Programming Interfaces - Paquetes)
122 Compilacion de programas formados por varios modulos
Consideremos la division de la implementacion de un problema CC++ en dos ficherosprograma1cc y programa2cc Segun se muestra en la Figura 13 el primer paso consisteen editar dichos ficheros (con el editor vi por ejemplo) A continuaci on la orden que sedeberıa emitir para generar la aplicacion es
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 949
Herramientas y Lenguajes de Programacion 06-07 7
Figura 13 Compilacion de varios modulos separados
g++ programa1c programa2c
Se ha de tener en cuenta que la llamada al enlazador (linker) se realiza de formaautomatica Por lo tanto los dos ficheros intermedios programa1o y programa2o seborraran al finalizar la operacion Si se quieren conservar ambos es necesario compilar conlos comandos
g++ -c programa1c
g++ -c programa2c
g++ programa1o programa2o
La procedencia de los ficheros que aporta el sistema operativo al proceso de compilaciones la siguiente
Ficheros de Cabecera - directorio usrinclude
Librerıas - directorios lib usrlib
123 Creacion de Librerıas
La creacion de librerıas (o bibliotecas) aporta modularidad y portabilidad a los pro-gramas
Una librerıa es un fichero que esta compuesto por una coleccion de otros ficheros lla-mados miembros de la librerıa La estructura de una librerıa posibilita la extraccion de
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1049
Herramientas y Lenguajes de Programacion 06-07 8
sus miembros Cuando se anade un fichero a una librerıa los datos de este y su informa-
cion administrativa (permisos fechas propietario grupo etc) se introduce en el Parauna descripcion detallada de las opciones de esta herrmienta visite la p agina de manual( man ar)
Las funciones basicas de ar son crear modificar y extraer miembros
ar [-] opciones [miembro] librerıa [ficheros]
Entre las opciones se deben distinguir aquellas que son obligatorias y los modificadoresCuando se emite una orden ar es necesario que haya una obligatoria y solo una
Los paquetes Java agrupan las clases en librerıas (bibliotecas) Los paquetes Java seutilizan de forma similar a como se utilizan las librerıas en C++ solo que en Java se
agrupan clases yo interfacesEn los paquetes las clases son unicas comparadas con las de otros paquetes y permi-
ten controlar el acceso Esto es los paquetes proporcionan una forma de ocultar clasesevitando que otros programas o paquetes accedan a clases que son de uso exclusivo de unaaplicacion determinada
Los paquetes se declaran utilizando la palabra reservada package seguida del nombredel paquete Esta sentencia debe estar al comienzo del fichero fuente Concretamente debeser la primera sentencia ejecutable del codigo Java excluyendo los comentarios y espaciosen blanco Por ejemplo
package figuras
public class Circulo
En este caso el nombre del paquete es figuras La clase Circulo se considera comoparte del paquete La inclusion de nuevas clases en el paquete es simple se ha de colocarla misma sentencia al comienzo de los ficheros que contengan la declaracion de las clasesCada uno de los ficheros que contengan clases pertenecientes a un mismo paquete debenincluir la misma sentencia package y solamente puede haber una sentencia package porfichero La sentencia package colocada el comienzo de un fichero fuente afectara a todaslas clases que se declaren en ese fichero
Se pueden referenciar paquetes precediendo con su nombre la clase que se quiere usar
Tambien se puede usar la palabra reservada import si se van a colocar multiples referenciasa un mismo paquete
La sentencia import se utiliza para incluir una lista de paquetes en los que buscar unaclase determinada y su sintaxis es
import nombre_paqueteNombre_Clase
Esta sentencia o grupo de ellas deben aparecer antes de cualquier declaracion de claseen el codigo fuente
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1149
Herramientas y Lenguajes de Programacion 06-07 9
124 Documentacion
La herramienta javadoc genera paginas HTML de documentacion del API a partir deficheros con codigo fuente Java
En la lınea de comandos se le puede pasar a javadoc una serie de paquetes o ficherosJava para los que se desea generar documentacion Se genera documentacion para el pa-quete especificado o para los ficheros fuentes Java individuales que se listen en la lınea decomandos Se genera un fichero html por cada fichero java que se encuentre Tambiense genera la jerarquıa de clases (treehtml) y un ındice con todos los miembros que hadetectado (AllNameshtml)
La utilidad javadoc extrae informacion de los siguiente elementos
Paquetes
Clases e interfaces publicas
Metodos publicos y protegidos
Datos publicos y protegidos
Se puede anadir documentacion para todos estos entes a traves de comentarios dedocumentacion en el codigo fuente Estos comentarios pueden incluir marcas HTML Uncomentario de documentacion esta formado por todos los caracteres incluidos entre queindica el comienzo del comentario y que indica el final En todas las lıneas intermediaslos caracteres a la izquierda se ignoran y tambien todos los espacios y tabuladores queprecedan a ese caracter
Este es un comentario de documentacion
Se pueden incluir etiquetas HTML dentro de un comentario de documentacion aunqueno deben utilizarse las etiquetas lth1gt lth2gt o lıneas horizontales lthrgt porque javadoc
crea una estructura completa para el documento y estas marcas interfieren con el formatogeneral de ese documento
Cada comentario de documentacion puede incluir texto libre seguido de etiquetas de
documentaciacute on Estas etiquetas comienzan siempre con el signo y deben situarse alprincipio de la lınea (tener en cuenta que todo lo que haya hasta el primer caracter se ignora) y todas las etiquetas con el mismo nombre deben agruparse juntas dentro delcomentario de documentacion
Marcas de documentacion de clases e interface
see nombre_de_clase
Anade un enlace a la clase especificada en la zona ldquoSee Alsordquo Por ejemplo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1249
Herramientas y Lenguajes de Programacion 06-07 10
see javalangString
see Stringsee Stringequals
see javalangObjectwaint(int)
see CharacterMAX_RADIX
see lta href=spechtmlgtEspecif Javaltagt
Se utiliza el caracter para separar el nombre de una clase del nombre de uno desus campos de datos metodos o constructores
version texto-version
Anade una entrada ldquoVersionrdquo El texto no tiene que tener formato especial
author texto-autor
Anade una entrada ldquoAuthorrdquo El texto no tiene que tener formato especial
since texto
Este texto no tiene una estructura especial Se utiliza para indicar desde que fechao desde que version se ha introducido el cambio o caracterıstica que indica el texto
deprecated texto
Anade un comentario indicando que el metodo esta desautorizado y no deberıa uti-lizarse porque puede dejar de ser soportada por el API La convencion que se siguees indicar en el texto la funcion o metodo por quien se ha sustituido Ejemplo decomentario de una clase
Clase que representa la figura geometrica cilindro
Por ejemplo
ltPREgt
Cilindro c = new Cilindro(10)
double d = cvolumen()
ltPREgt
see figurasCirculo
see figurasObjetoGeometrico
version 15 14 Mar 04
author Coromoto Leon Hernandez
public class Cilindro extends Circulo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1349
Herramientas y Lenguajes de Programacion 06-07 11
Marcas de documentacion de campos de datos
La unica marca especial que se puede incluir es la marca see Ejemplo de comentariode un campo de datos
El palo de bastos
public static final int BASTOS = 1
Marcas de documentacion de constructores y metodos
Pueden ser marcas see y ademas
param parametro descripcion
Anade un parametro a la seccion ldquoParametersrdquo La descripcion puede continuar enla lınea siguiente
return descripcion
Anade una seccion ldquoReturnrdquo que debe contener la descripcion del valor a devolver
throws exception descripcion
Anade una entrada ldquoThrowsrdquo que contiene el nombre de la excepcion que puede ser
lanzada por el metodo La excepcion estara enlazada con su clase en la documenta-cion
see nombre_de_clase
Anade un enlace a la clase en la zona ldquoSee Alsordquo
since texto
Indica desde que fecha o desde que version se ha introducido el cambio o caracterısticaque indica el texto
deprecated texto
Indica que no deberıa utilizarse el metodo porque esta desautorizado y puede dejarde ser soportado por el API en cualquier momento Ejemplo de comentario de unmetodo
Devuelve el caracter de la posicion indicada entre
ltttgt0ltttgt y ltttgtlength()-1ltttgt
param indice La posicion del caracter a obtener
return El caracter situado en la posicion
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1449
Herramientas y Lenguajes de Programacion 06-07 12
Figura 14 Evolucion de la metodologıa de programacion
exception StringIndexOutOfRangeException
Se prodcue cuando el indice no esta en el rango ltttgt0ltttgt a ltttgtlength()-1ltttgt
public char charAt( int indice )
13 Lenguajes de Programacion
El debate en este caso se centra en la programacion orientada a objetos frente a laprogramacion tradicional La Figura 14 muestra la evolucion de la metodologıa de la
programacion desde los primeros tiempos de la informatica hasta hoyEn la historia de la programacion ha habido varias evoluciones sucesivas Una de lasprincipales fue la programacion estructurada cuyo principio fundamental era dividir unprograma en subprogramas mas pequenos y faciles de resolver hasta llegar a niveles decomplejidad elementales siempre apoyandose en la idea de iquestQue debe hacer el programa
Este metodo de diseno a pesar de haber dado resultados satisfactorios tiene limita-ciones Algunas de ellas son
No favorece la reulitizacion del codigo
Si en la figura anterior fn1 y fn2 fueran identicas este hecho seguramente pasarıadesapercibido y no se compartirıa una unica funcion fn
Si dos subprogramas comparten una misma funcion fn reutilizando ası el codigo quedefine la misma y mas adelante queremos modificar fn porque hay un cambio enuno de los subprogramas que la utilizan la modificacion afectara tambien al otrosubprograma razon por la que ahora tendremos que realizar dos funciones
Por lo tanto se tiene que la programacion tradicional se desarrolla a partir de proce-dimientos y datos sin delimitar que procedimientos actuan sobre que datos
El diseno orientado a objetos se interesa en primer lugar por los datos a los que seasocian posteriormente procedimientos En este caso la idea principal es iquestde que trata el
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1549
Herramientas y Lenguajes de Programacion 06-07 13
programa Ası que el desarrollo se organiza en torno a los datos y no a como se debefuncionar
En la programacion orientada a objetos un programa es una coleccion de una solaentidad basica el objeto el cual combina los datos con los procedimientos que actuan
sobre ellos Durante la ejecucion los ob jetos reciben y envıan mensajes a otros objetospara ejecutar las acciones requeridas
La programacion orientada a objetos se puede llevar a cabo con lenguajes convenciona-les pero esto exige al programador la construccion de los mecanismos de que disponen loslenguajes orientados a objetos tales como objetos clases metodos mensajes herenciaetc
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1649
Herramientas y Lenguajes de Programacion 06-07 14
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1749
Capıtulo 2
Programas Java Aplicaciones
El objetivo de este ejercicio practico es mostrar el modo de funcionamiento de losdistintos tipos de programas Java En este caso se abordar an las aplicaciones
21 Ejemplo de aplicacion
El codigo que aparece a continuacion implementa en Java la aplicacion que muestraen la terminal la frase ldquoHola Mundo en Javardquo
1
2 Applicacion Simple3
4 class AplicacionSimple
5 public static void main(String[] args)
6 Systemoutprintln(Hola Mundo en Java)
7
8
El primer paso para manipular una aplicacion Java es compilarla ejecutando en la lıneade comandos la instruccion
gtjavac AplicacionSimplejava
Es importante que el nombre del fichero que contiene el c odigo coincida exactamentecon el nombre de la clase que aparece en la lınea numero 3
Al realizar este paso se obtiene un fichero AplicacionSimpleclass Para ejecutar la aplicacion escribimos en la lınea de comandos
gtjava AplicacionSimple
y obtenemos el resultado que aparece en la figura 21
15
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1849
Herramientas y Lenguajes de Programacion 06-07 16
Figura 21 Ejecucion de la aplicacion
22 Ejercicios
1 Compile y ejecute el ejemplo de aplicacion
2 Escriba una aplicacion Java que
Contemple la creacion de una clase (Clase1) que contengan un atributo enteroy metodos para establecer y recuperar los valores de dicho atributo
Definir una segunda clase (Clase2) con un atributo que es un objeto de la
Clase1 y con un metodo que establece diez valores diferentes en el atributo dela Clase1
Definir una tercera clase (Clase3) con un atributo que es un objeto de la Clase1
y con un metodo que recupera diez valores del atributo de la Clase1
Finalmente crear una clase de prueba donde se instancien objetos de las clasesanteriores y se invoque a sus metodos
3 Escriba la jerarquıa de clases del programa que ha desarrollado
4 Dibuje una traza del flujo de ejecucion de la aplicacion
5 Comente sus clases utilizando javadoc genere ficheros de descripcion de su clase
similares a los de la documentacion de las API de Java
En el documento de descripcion de la herramienta Javadoc puede encontrar la formade uso de las distintas etiquetas disponibles
see author version param return
(conexion a javasuncom )
Ejecute el comando javadoc desde la lınea de comandos sin ningun argumento yobtendra una lista de las opciones con las que puede llamar a la herramienta
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1949
Herramientas y Lenguajes de Programacion 06-07 17
Notese que para que aparezcan en el fichero html los comentarios asociados a los
campos de datos privados tiene que compilarlos con la opcion -privateDe la misma forma para que aparezcan el autor y la versi on se han de utilizar lasopciones -author y -version
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2049
Capıtulo 3
Programas Java applets
El objetivo de esta practica es mostrar el modo de funcionamiento de los distintos tiposde programas Java En esta practica se abordaran los applets
31 Ejemplo de applet
El codigo que aparece a continuacion muestra la implementacion en Java del programaque muestra en la ventana principal del navegador la frase ldquoHola Mundo en Javardquo
Applet Sencillo
import javaappletApplet
import javaawtGraphics
public class AppletSimple extends Applet
public void paint(Graphics g)
gdrawString(Hola Mundo en Java 50 25)
El primer paso para manipular un applet Java es compilarlo ejecutando en la lınea decomandos la instruccion
gtjavac AppletSimplejava
Al realizar este paso se obtiene una fichero AppletSimpleclassEl fichero class resultante de la compilacion se ha de incrustar en un fichero para
ser ejecutado por un navegadorEn este caso las etiquetas a utilizar son ltAPPLETgt y ltAPPLETgt
18
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 849
Herramientas y Lenguajes de Programacion 06-07 6
Figura 12 Herramientas del compilador de GCC
El editor de carga y enlace (ld) se invoca automaticamente sin especificar ninguna
opciong++ programaC
Se obtiene el fichero aout que ya es ejecutable
Los ficheros intermedios generados se almacenan en tmp y se borran cuando terminatodo el proceso de compilacion
En el caso de Java se habla de un lenguaje de programaci on y de una plataformade ejecucion Como lenguaje de programacion de alto nivel se ha de destacar que escompletamente orientado a objetos y tiene definida una sintaxis y una semantica Laplataforma de ejecucion de Java esta compuesta por
La Maquina Virtual de Java (Java Virtual Machine - JVM)
Los APIs (Application Programming Interfaces - Paquetes)
122 Compilacion de programas formados por varios modulos
Consideremos la division de la implementacion de un problema CC++ en dos ficherosprograma1cc y programa2cc Segun se muestra en la Figura 13 el primer paso consisteen editar dichos ficheros (con el editor vi por ejemplo) A continuaci on la orden que sedeberıa emitir para generar la aplicacion es
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 949
Herramientas y Lenguajes de Programacion 06-07 7
Figura 13 Compilacion de varios modulos separados
g++ programa1c programa2c
Se ha de tener en cuenta que la llamada al enlazador (linker) se realiza de formaautomatica Por lo tanto los dos ficheros intermedios programa1o y programa2o seborraran al finalizar la operacion Si se quieren conservar ambos es necesario compilar conlos comandos
g++ -c programa1c
g++ -c programa2c
g++ programa1o programa2o
La procedencia de los ficheros que aporta el sistema operativo al proceso de compilaciones la siguiente
Ficheros de Cabecera - directorio usrinclude
Librerıas - directorios lib usrlib
123 Creacion de Librerıas
La creacion de librerıas (o bibliotecas) aporta modularidad y portabilidad a los pro-gramas
Una librerıa es un fichero que esta compuesto por una coleccion de otros ficheros lla-mados miembros de la librerıa La estructura de una librerıa posibilita la extraccion de
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1049
Herramientas y Lenguajes de Programacion 06-07 8
sus miembros Cuando se anade un fichero a una librerıa los datos de este y su informa-
cion administrativa (permisos fechas propietario grupo etc) se introduce en el Parauna descripcion detallada de las opciones de esta herrmienta visite la p agina de manual( man ar)
Las funciones basicas de ar son crear modificar y extraer miembros
ar [-] opciones [miembro] librerıa [ficheros]
Entre las opciones se deben distinguir aquellas que son obligatorias y los modificadoresCuando se emite una orden ar es necesario que haya una obligatoria y solo una
Los paquetes Java agrupan las clases en librerıas (bibliotecas) Los paquetes Java seutilizan de forma similar a como se utilizan las librerıas en C++ solo que en Java se
agrupan clases yo interfacesEn los paquetes las clases son unicas comparadas con las de otros paquetes y permi-
ten controlar el acceso Esto es los paquetes proporcionan una forma de ocultar clasesevitando que otros programas o paquetes accedan a clases que son de uso exclusivo de unaaplicacion determinada
Los paquetes se declaran utilizando la palabra reservada package seguida del nombredel paquete Esta sentencia debe estar al comienzo del fichero fuente Concretamente debeser la primera sentencia ejecutable del codigo Java excluyendo los comentarios y espaciosen blanco Por ejemplo
package figuras
public class Circulo
En este caso el nombre del paquete es figuras La clase Circulo se considera comoparte del paquete La inclusion de nuevas clases en el paquete es simple se ha de colocarla misma sentencia al comienzo de los ficheros que contengan la declaracion de las clasesCada uno de los ficheros que contengan clases pertenecientes a un mismo paquete debenincluir la misma sentencia package y solamente puede haber una sentencia package porfichero La sentencia package colocada el comienzo de un fichero fuente afectara a todaslas clases que se declaren en ese fichero
Se pueden referenciar paquetes precediendo con su nombre la clase que se quiere usar
Tambien se puede usar la palabra reservada import si se van a colocar multiples referenciasa un mismo paquete
La sentencia import se utiliza para incluir una lista de paquetes en los que buscar unaclase determinada y su sintaxis es
import nombre_paqueteNombre_Clase
Esta sentencia o grupo de ellas deben aparecer antes de cualquier declaracion de claseen el codigo fuente
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1149
Herramientas y Lenguajes de Programacion 06-07 9
124 Documentacion
La herramienta javadoc genera paginas HTML de documentacion del API a partir deficheros con codigo fuente Java
En la lınea de comandos se le puede pasar a javadoc una serie de paquetes o ficherosJava para los que se desea generar documentacion Se genera documentacion para el pa-quete especificado o para los ficheros fuentes Java individuales que se listen en la lınea decomandos Se genera un fichero html por cada fichero java que se encuentre Tambiense genera la jerarquıa de clases (treehtml) y un ındice con todos los miembros que hadetectado (AllNameshtml)
La utilidad javadoc extrae informacion de los siguiente elementos
Paquetes
Clases e interfaces publicas
Metodos publicos y protegidos
Datos publicos y protegidos
Se puede anadir documentacion para todos estos entes a traves de comentarios dedocumentacion en el codigo fuente Estos comentarios pueden incluir marcas HTML Uncomentario de documentacion esta formado por todos los caracteres incluidos entre queindica el comienzo del comentario y que indica el final En todas las lıneas intermediaslos caracteres a la izquierda se ignoran y tambien todos los espacios y tabuladores queprecedan a ese caracter
Este es un comentario de documentacion
Se pueden incluir etiquetas HTML dentro de un comentario de documentacion aunqueno deben utilizarse las etiquetas lth1gt lth2gt o lıneas horizontales lthrgt porque javadoc
crea una estructura completa para el documento y estas marcas interfieren con el formatogeneral de ese documento
Cada comentario de documentacion puede incluir texto libre seguido de etiquetas de
documentaciacute on Estas etiquetas comienzan siempre con el signo y deben situarse alprincipio de la lınea (tener en cuenta que todo lo que haya hasta el primer caracter se ignora) y todas las etiquetas con el mismo nombre deben agruparse juntas dentro delcomentario de documentacion
Marcas de documentacion de clases e interface
see nombre_de_clase
Anade un enlace a la clase especificada en la zona ldquoSee Alsordquo Por ejemplo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1249
Herramientas y Lenguajes de Programacion 06-07 10
see javalangString
see Stringsee Stringequals
see javalangObjectwaint(int)
see CharacterMAX_RADIX
see lta href=spechtmlgtEspecif Javaltagt
Se utiliza el caracter para separar el nombre de una clase del nombre de uno desus campos de datos metodos o constructores
version texto-version
Anade una entrada ldquoVersionrdquo El texto no tiene que tener formato especial
author texto-autor
Anade una entrada ldquoAuthorrdquo El texto no tiene que tener formato especial
since texto
Este texto no tiene una estructura especial Se utiliza para indicar desde que fechao desde que version se ha introducido el cambio o caracterıstica que indica el texto
deprecated texto
Anade un comentario indicando que el metodo esta desautorizado y no deberıa uti-lizarse porque puede dejar de ser soportada por el API La convencion que se siguees indicar en el texto la funcion o metodo por quien se ha sustituido Ejemplo decomentario de una clase
Clase que representa la figura geometrica cilindro
Por ejemplo
ltPREgt
Cilindro c = new Cilindro(10)
double d = cvolumen()
ltPREgt
see figurasCirculo
see figurasObjetoGeometrico
version 15 14 Mar 04
author Coromoto Leon Hernandez
public class Cilindro extends Circulo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1349
Herramientas y Lenguajes de Programacion 06-07 11
Marcas de documentacion de campos de datos
La unica marca especial que se puede incluir es la marca see Ejemplo de comentariode un campo de datos
El palo de bastos
public static final int BASTOS = 1
Marcas de documentacion de constructores y metodos
Pueden ser marcas see y ademas
param parametro descripcion
Anade un parametro a la seccion ldquoParametersrdquo La descripcion puede continuar enla lınea siguiente
return descripcion
Anade una seccion ldquoReturnrdquo que debe contener la descripcion del valor a devolver
throws exception descripcion
Anade una entrada ldquoThrowsrdquo que contiene el nombre de la excepcion que puede ser
lanzada por el metodo La excepcion estara enlazada con su clase en la documenta-cion
see nombre_de_clase
Anade un enlace a la clase en la zona ldquoSee Alsordquo
since texto
Indica desde que fecha o desde que version se ha introducido el cambio o caracterısticaque indica el texto
deprecated texto
Indica que no deberıa utilizarse el metodo porque esta desautorizado y puede dejarde ser soportado por el API en cualquier momento Ejemplo de comentario de unmetodo
Devuelve el caracter de la posicion indicada entre
ltttgt0ltttgt y ltttgtlength()-1ltttgt
param indice La posicion del caracter a obtener
return El caracter situado en la posicion
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1449
Herramientas y Lenguajes de Programacion 06-07 12
Figura 14 Evolucion de la metodologıa de programacion
exception StringIndexOutOfRangeException
Se prodcue cuando el indice no esta en el rango ltttgt0ltttgt a ltttgtlength()-1ltttgt
public char charAt( int indice )
13 Lenguajes de Programacion
El debate en este caso se centra en la programacion orientada a objetos frente a laprogramacion tradicional La Figura 14 muestra la evolucion de la metodologıa de la
programacion desde los primeros tiempos de la informatica hasta hoyEn la historia de la programacion ha habido varias evoluciones sucesivas Una de lasprincipales fue la programacion estructurada cuyo principio fundamental era dividir unprograma en subprogramas mas pequenos y faciles de resolver hasta llegar a niveles decomplejidad elementales siempre apoyandose en la idea de iquestQue debe hacer el programa
Este metodo de diseno a pesar de haber dado resultados satisfactorios tiene limita-ciones Algunas de ellas son
No favorece la reulitizacion del codigo
Si en la figura anterior fn1 y fn2 fueran identicas este hecho seguramente pasarıadesapercibido y no se compartirıa una unica funcion fn
Si dos subprogramas comparten una misma funcion fn reutilizando ası el codigo quedefine la misma y mas adelante queremos modificar fn porque hay un cambio enuno de los subprogramas que la utilizan la modificacion afectara tambien al otrosubprograma razon por la que ahora tendremos que realizar dos funciones
Por lo tanto se tiene que la programacion tradicional se desarrolla a partir de proce-dimientos y datos sin delimitar que procedimientos actuan sobre que datos
El diseno orientado a objetos se interesa en primer lugar por los datos a los que seasocian posteriormente procedimientos En este caso la idea principal es iquestde que trata el
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1549
Herramientas y Lenguajes de Programacion 06-07 13
programa Ası que el desarrollo se organiza en torno a los datos y no a como se debefuncionar
En la programacion orientada a objetos un programa es una coleccion de una solaentidad basica el objeto el cual combina los datos con los procedimientos que actuan
sobre ellos Durante la ejecucion los ob jetos reciben y envıan mensajes a otros objetospara ejecutar las acciones requeridas
La programacion orientada a objetos se puede llevar a cabo con lenguajes convenciona-les pero esto exige al programador la construccion de los mecanismos de que disponen loslenguajes orientados a objetos tales como objetos clases metodos mensajes herenciaetc
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1649
Herramientas y Lenguajes de Programacion 06-07 14
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1749
Capıtulo 2
Programas Java Aplicaciones
El objetivo de este ejercicio practico es mostrar el modo de funcionamiento de losdistintos tipos de programas Java En este caso se abordar an las aplicaciones
21 Ejemplo de aplicacion
El codigo que aparece a continuacion implementa en Java la aplicacion que muestraen la terminal la frase ldquoHola Mundo en Javardquo
1
2 Applicacion Simple3
4 class AplicacionSimple
5 public static void main(String[] args)
6 Systemoutprintln(Hola Mundo en Java)
7
8
El primer paso para manipular una aplicacion Java es compilarla ejecutando en la lıneade comandos la instruccion
gtjavac AplicacionSimplejava
Es importante que el nombre del fichero que contiene el c odigo coincida exactamentecon el nombre de la clase que aparece en la lınea numero 3
Al realizar este paso se obtiene un fichero AplicacionSimpleclass Para ejecutar la aplicacion escribimos en la lınea de comandos
gtjava AplicacionSimple
y obtenemos el resultado que aparece en la figura 21
15
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1849
Herramientas y Lenguajes de Programacion 06-07 16
Figura 21 Ejecucion de la aplicacion
22 Ejercicios
1 Compile y ejecute el ejemplo de aplicacion
2 Escriba una aplicacion Java que
Contemple la creacion de una clase (Clase1) que contengan un atributo enteroy metodos para establecer y recuperar los valores de dicho atributo
Definir una segunda clase (Clase2) con un atributo que es un objeto de la
Clase1 y con un metodo que establece diez valores diferentes en el atributo dela Clase1
Definir una tercera clase (Clase3) con un atributo que es un objeto de la Clase1
y con un metodo que recupera diez valores del atributo de la Clase1
Finalmente crear una clase de prueba donde se instancien objetos de las clasesanteriores y se invoque a sus metodos
3 Escriba la jerarquıa de clases del programa que ha desarrollado
4 Dibuje una traza del flujo de ejecucion de la aplicacion
5 Comente sus clases utilizando javadoc genere ficheros de descripcion de su clase
similares a los de la documentacion de las API de Java
En el documento de descripcion de la herramienta Javadoc puede encontrar la formade uso de las distintas etiquetas disponibles
see author version param return
(conexion a javasuncom )
Ejecute el comando javadoc desde la lınea de comandos sin ningun argumento yobtendra una lista de las opciones con las que puede llamar a la herramienta
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1949
Herramientas y Lenguajes de Programacion 06-07 17
Notese que para que aparezcan en el fichero html los comentarios asociados a los
campos de datos privados tiene que compilarlos con la opcion -privateDe la misma forma para que aparezcan el autor y la versi on se han de utilizar lasopciones -author y -version
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2049
Capıtulo 3
Programas Java applets
El objetivo de esta practica es mostrar el modo de funcionamiento de los distintos tiposde programas Java En esta practica se abordaran los applets
31 Ejemplo de applet
El codigo que aparece a continuacion muestra la implementacion en Java del programaque muestra en la ventana principal del navegador la frase ldquoHola Mundo en Javardquo
Applet Sencillo
import javaappletApplet
import javaawtGraphics
public class AppletSimple extends Applet
public void paint(Graphics g)
gdrawString(Hola Mundo en Java 50 25)
El primer paso para manipular un applet Java es compilarlo ejecutando en la lınea decomandos la instruccion
gtjavac AppletSimplejava
Al realizar este paso se obtiene una fichero AppletSimpleclassEl fichero class resultante de la compilacion se ha de incrustar en un fichero para
ser ejecutado por un navegadorEn este caso las etiquetas a utilizar son ltAPPLETgt y ltAPPLETgt
18
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 949
Herramientas y Lenguajes de Programacion 06-07 7
Figura 13 Compilacion de varios modulos separados
g++ programa1c programa2c
Se ha de tener en cuenta que la llamada al enlazador (linker) se realiza de formaautomatica Por lo tanto los dos ficheros intermedios programa1o y programa2o seborraran al finalizar la operacion Si se quieren conservar ambos es necesario compilar conlos comandos
g++ -c programa1c
g++ -c programa2c
g++ programa1o programa2o
La procedencia de los ficheros que aporta el sistema operativo al proceso de compilaciones la siguiente
Ficheros de Cabecera - directorio usrinclude
Librerıas - directorios lib usrlib
123 Creacion de Librerıas
La creacion de librerıas (o bibliotecas) aporta modularidad y portabilidad a los pro-gramas
Una librerıa es un fichero que esta compuesto por una coleccion de otros ficheros lla-mados miembros de la librerıa La estructura de una librerıa posibilita la extraccion de
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1049
Herramientas y Lenguajes de Programacion 06-07 8
sus miembros Cuando se anade un fichero a una librerıa los datos de este y su informa-
cion administrativa (permisos fechas propietario grupo etc) se introduce en el Parauna descripcion detallada de las opciones de esta herrmienta visite la p agina de manual( man ar)
Las funciones basicas de ar son crear modificar y extraer miembros
ar [-] opciones [miembro] librerıa [ficheros]
Entre las opciones se deben distinguir aquellas que son obligatorias y los modificadoresCuando se emite una orden ar es necesario que haya una obligatoria y solo una
Los paquetes Java agrupan las clases en librerıas (bibliotecas) Los paquetes Java seutilizan de forma similar a como se utilizan las librerıas en C++ solo que en Java se
agrupan clases yo interfacesEn los paquetes las clases son unicas comparadas con las de otros paquetes y permi-
ten controlar el acceso Esto es los paquetes proporcionan una forma de ocultar clasesevitando que otros programas o paquetes accedan a clases que son de uso exclusivo de unaaplicacion determinada
Los paquetes se declaran utilizando la palabra reservada package seguida del nombredel paquete Esta sentencia debe estar al comienzo del fichero fuente Concretamente debeser la primera sentencia ejecutable del codigo Java excluyendo los comentarios y espaciosen blanco Por ejemplo
package figuras
public class Circulo
En este caso el nombre del paquete es figuras La clase Circulo se considera comoparte del paquete La inclusion de nuevas clases en el paquete es simple se ha de colocarla misma sentencia al comienzo de los ficheros que contengan la declaracion de las clasesCada uno de los ficheros que contengan clases pertenecientes a un mismo paquete debenincluir la misma sentencia package y solamente puede haber una sentencia package porfichero La sentencia package colocada el comienzo de un fichero fuente afectara a todaslas clases que se declaren en ese fichero
Se pueden referenciar paquetes precediendo con su nombre la clase que se quiere usar
Tambien se puede usar la palabra reservada import si se van a colocar multiples referenciasa un mismo paquete
La sentencia import se utiliza para incluir una lista de paquetes en los que buscar unaclase determinada y su sintaxis es
import nombre_paqueteNombre_Clase
Esta sentencia o grupo de ellas deben aparecer antes de cualquier declaracion de claseen el codigo fuente
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1149
Herramientas y Lenguajes de Programacion 06-07 9
124 Documentacion
La herramienta javadoc genera paginas HTML de documentacion del API a partir deficheros con codigo fuente Java
En la lınea de comandos se le puede pasar a javadoc una serie de paquetes o ficherosJava para los que se desea generar documentacion Se genera documentacion para el pa-quete especificado o para los ficheros fuentes Java individuales que se listen en la lınea decomandos Se genera un fichero html por cada fichero java que se encuentre Tambiense genera la jerarquıa de clases (treehtml) y un ındice con todos los miembros que hadetectado (AllNameshtml)
La utilidad javadoc extrae informacion de los siguiente elementos
Paquetes
Clases e interfaces publicas
Metodos publicos y protegidos
Datos publicos y protegidos
Se puede anadir documentacion para todos estos entes a traves de comentarios dedocumentacion en el codigo fuente Estos comentarios pueden incluir marcas HTML Uncomentario de documentacion esta formado por todos los caracteres incluidos entre queindica el comienzo del comentario y que indica el final En todas las lıneas intermediaslos caracteres a la izquierda se ignoran y tambien todos los espacios y tabuladores queprecedan a ese caracter
Este es un comentario de documentacion
Se pueden incluir etiquetas HTML dentro de un comentario de documentacion aunqueno deben utilizarse las etiquetas lth1gt lth2gt o lıneas horizontales lthrgt porque javadoc
crea una estructura completa para el documento y estas marcas interfieren con el formatogeneral de ese documento
Cada comentario de documentacion puede incluir texto libre seguido de etiquetas de
documentaciacute on Estas etiquetas comienzan siempre con el signo y deben situarse alprincipio de la lınea (tener en cuenta que todo lo que haya hasta el primer caracter se ignora) y todas las etiquetas con el mismo nombre deben agruparse juntas dentro delcomentario de documentacion
Marcas de documentacion de clases e interface
see nombre_de_clase
Anade un enlace a la clase especificada en la zona ldquoSee Alsordquo Por ejemplo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1249
Herramientas y Lenguajes de Programacion 06-07 10
see javalangString
see Stringsee Stringequals
see javalangObjectwaint(int)
see CharacterMAX_RADIX
see lta href=spechtmlgtEspecif Javaltagt
Se utiliza el caracter para separar el nombre de una clase del nombre de uno desus campos de datos metodos o constructores
version texto-version
Anade una entrada ldquoVersionrdquo El texto no tiene que tener formato especial
author texto-autor
Anade una entrada ldquoAuthorrdquo El texto no tiene que tener formato especial
since texto
Este texto no tiene una estructura especial Se utiliza para indicar desde que fechao desde que version se ha introducido el cambio o caracterıstica que indica el texto
deprecated texto
Anade un comentario indicando que el metodo esta desautorizado y no deberıa uti-lizarse porque puede dejar de ser soportada por el API La convencion que se siguees indicar en el texto la funcion o metodo por quien se ha sustituido Ejemplo decomentario de una clase
Clase que representa la figura geometrica cilindro
Por ejemplo
ltPREgt
Cilindro c = new Cilindro(10)
double d = cvolumen()
ltPREgt
see figurasCirculo
see figurasObjetoGeometrico
version 15 14 Mar 04
author Coromoto Leon Hernandez
public class Cilindro extends Circulo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1349
Herramientas y Lenguajes de Programacion 06-07 11
Marcas de documentacion de campos de datos
La unica marca especial que se puede incluir es la marca see Ejemplo de comentariode un campo de datos
El palo de bastos
public static final int BASTOS = 1
Marcas de documentacion de constructores y metodos
Pueden ser marcas see y ademas
param parametro descripcion
Anade un parametro a la seccion ldquoParametersrdquo La descripcion puede continuar enla lınea siguiente
return descripcion
Anade una seccion ldquoReturnrdquo que debe contener la descripcion del valor a devolver
throws exception descripcion
Anade una entrada ldquoThrowsrdquo que contiene el nombre de la excepcion que puede ser
lanzada por el metodo La excepcion estara enlazada con su clase en la documenta-cion
see nombre_de_clase
Anade un enlace a la clase en la zona ldquoSee Alsordquo
since texto
Indica desde que fecha o desde que version se ha introducido el cambio o caracterısticaque indica el texto
deprecated texto
Indica que no deberıa utilizarse el metodo porque esta desautorizado y puede dejarde ser soportado por el API en cualquier momento Ejemplo de comentario de unmetodo
Devuelve el caracter de la posicion indicada entre
ltttgt0ltttgt y ltttgtlength()-1ltttgt
param indice La posicion del caracter a obtener
return El caracter situado en la posicion
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1449
Herramientas y Lenguajes de Programacion 06-07 12
Figura 14 Evolucion de la metodologıa de programacion
exception StringIndexOutOfRangeException
Se prodcue cuando el indice no esta en el rango ltttgt0ltttgt a ltttgtlength()-1ltttgt
public char charAt( int indice )
13 Lenguajes de Programacion
El debate en este caso se centra en la programacion orientada a objetos frente a laprogramacion tradicional La Figura 14 muestra la evolucion de la metodologıa de la
programacion desde los primeros tiempos de la informatica hasta hoyEn la historia de la programacion ha habido varias evoluciones sucesivas Una de lasprincipales fue la programacion estructurada cuyo principio fundamental era dividir unprograma en subprogramas mas pequenos y faciles de resolver hasta llegar a niveles decomplejidad elementales siempre apoyandose en la idea de iquestQue debe hacer el programa
Este metodo de diseno a pesar de haber dado resultados satisfactorios tiene limita-ciones Algunas de ellas son
No favorece la reulitizacion del codigo
Si en la figura anterior fn1 y fn2 fueran identicas este hecho seguramente pasarıadesapercibido y no se compartirıa una unica funcion fn
Si dos subprogramas comparten una misma funcion fn reutilizando ası el codigo quedefine la misma y mas adelante queremos modificar fn porque hay un cambio enuno de los subprogramas que la utilizan la modificacion afectara tambien al otrosubprograma razon por la que ahora tendremos que realizar dos funciones
Por lo tanto se tiene que la programacion tradicional se desarrolla a partir de proce-dimientos y datos sin delimitar que procedimientos actuan sobre que datos
El diseno orientado a objetos se interesa en primer lugar por los datos a los que seasocian posteriormente procedimientos En este caso la idea principal es iquestde que trata el
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1549
Herramientas y Lenguajes de Programacion 06-07 13
programa Ası que el desarrollo se organiza en torno a los datos y no a como se debefuncionar
En la programacion orientada a objetos un programa es una coleccion de una solaentidad basica el objeto el cual combina los datos con los procedimientos que actuan
sobre ellos Durante la ejecucion los ob jetos reciben y envıan mensajes a otros objetospara ejecutar las acciones requeridas
La programacion orientada a objetos se puede llevar a cabo con lenguajes convenciona-les pero esto exige al programador la construccion de los mecanismos de que disponen loslenguajes orientados a objetos tales como objetos clases metodos mensajes herenciaetc
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1649
Herramientas y Lenguajes de Programacion 06-07 14
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1749
Capıtulo 2
Programas Java Aplicaciones
El objetivo de este ejercicio practico es mostrar el modo de funcionamiento de losdistintos tipos de programas Java En este caso se abordar an las aplicaciones
21 Ejemplo de aplicacion
El codigo que aparece a continuacion implementa en Java la aplicacion que muestraen la terminal la frase ldquoHola Mundo en Javardquo
1
2 Applicacion Simple3
4 class AplicacionSimple
5 public static void main(String[] args)
6 Systemoutprintln(Hola Mundo en Java)
7
8
El primer paso para manipular una aplicacion Java es compilarla ejecutando en la lıneade comandos la instruccion
gtjavac AplicacionSimplejava
Es importante que el nombre del fichero que contiene el c odigo coincida exactamentecon el nombre de la clase que aparece en la lınea numero 3
Al realizar este paso se obtiene un fichero AplicacionSimpleclass Para ejecutar la aplicacion escribimos en la lınea de comandos
gtjava AplicacionSimple
y obtenemos el resultado que aparece en la figura 21
15
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1849
Herramientas y Lenguajes de Programacion 06-07 16
Figura 21 Ejecucion de la aplicacion
22 Ejercicios
1 Compile y ejecute el ejemplo de aplicacion
2 Escriba una aplicacion Java que
Contemple la creacion de una clase (Clase1) que contengan un atributo enteroy metodos para establecer y recuperar los valores de dicho atributo
Definir una segunda clase (Clase2) con un atributo que es un objeto de la
Clase1 y con un metodo que establece diez valores diferentes en el atributo dela Clase1
Definir una tercera clase (Clase3) con un atributo que es un objeto de la Clase1
y con un metodo que recupera diez valores del atributo de la Clase1
Finalmente crear una clase de prueba donde se instancien objetos de las clasesanteriores y se invoque a sus metodos
3 Escriba la jerarquıa de clases del programa que ha desarrollado
4 Dibuje una traza del flujo de ejecucion de la aplicacion
5 Comente sus clases utilizando javadoc genere ficheros de descripcion de su clase
similares a los de la documentacion de las API de Java
En el documento de descripcion de la herramienta Javadoc puede encontrar la formade uso de las distintas etiquetas disponibles
see author version param return
(conexion a javasuncom )
Ejecute el comando javadoc desde la lınea de comandos sin ningun argumento yobtendra una lista de las opciones con las que puede llamar a la herramienta
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1949
Herramientas y Lenguajes de Programacion 06-07 17
Notese que para que aparezcan en el fichero html los comentarios asociados a los
campos de datos privados tiene que compilarlos con la opcion -privateDe la misma forma para que aparezcan el autor y la versi on se han de utilizar lasopciones -author y -version
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2049
Capıtulo 3
Programas Java applets
El objetivo de esta practica es mostrar el modo de funcionamiento de los distintos tiposde programas Java En esta practica se abordaran los applets
31 Ejemplo de applet
El codigo que aparece a continuacion muestra la implementacion en Java del programaque muestra en la ventana principal del navegador la frase ldquoHola Mundo en Javardquo
Applet Sencillo
import javaappletApplet
import javaawtGraphics
public class AppletSimple extends Applet
public void paint(Graphics g)
gdrawString(Hola Mundo en Java 50 25)
El primer paso para manipular un applet Java es compilarlo ejecutando en la lınea decomandos la instruccion
gtjavac AppletSimplejava
Al realizar este paso se obtiene una fichero AppletSimpleclassEl fichero class resultante de la compilacion se ha de incrustar en un fichero para
ser ejecutado por un navegadorEn este caso las etiquetas a utilizar son ltAPPLETgt y ltAPPLETgt
18
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1049
Herramientas y Lenguajes de Programacion 06-07 8
sus miembros Cuando se anade un fichero a una librerıa los datos de este y su informa-
cion administrativa (permisos fechas propietario grupo etc) se introduce en el Parauna descripcion detallada de las opciones de esta herrmienta visite la p agina de manual( man ar)
Las funciones basicas de ar son crear modificar y extraer miembros
ar [-] opciones [miembro] librerıa [ficheros]
Entre las opciones se deben distinguir aquellas que son obligatorias y los modificadoresCuando se emite una orden ar es necesario que haya una obligatoria y solo una
Los paquetes Java agrupan las clases en librerıas (bibliotecas) Los paquetes Java seutilizan de forma similar a como se utilizan las librerıas en C++ solo que en Java se
agrupan clases yo interfacesEn los paquetes las clases son unicas comparadas con las de otros paquetes y permi-
ten controlar el acceso Esto es los paquetes proporcionan una forma de ocultar clasesevitando que otros programas o paquetes accedan a clases que son de uso exclusivo de unaaplicacion determinada
Los paquetes se declaran utilizando la palabra reservada package seguida del nombredel paquete Esta sentencia debe estar al comienzo del fichero fuente Concretamente debeser la primera sentencia ejecutable del codigo Java excluyendo los comentarios y espaciosen blanco Por ejemplo
package figuras
public class Circulo
En este caso el nombre del paquete es figuras La clase Circulo se considera comoparte del paquete La inclusion de nuevas clases en el paquete es simple se ha de colocarla misma sentencia al comienzo de los ficheros que contengan la declaracion de las clasesCada uno de los ficheros que contengan clases pertenecientes a un mismo paquete debenincluir la misma sentencia package y solamente puede haber una sentencia package porfichero La sentencia package colocada el comienzo de un fichero fuente afectara a todaslas clases que se declaren en ese fichero
Se pueden referenciar paquetes precediendo con su nombre la clase que se quiere usar
Tambien se puede usar la palabra reservada import si se van a colocar multiples referenciasa un mismo paquete
La sentencia import se utiliza para incluir una lista de paquetes en los que buscar unaclase determinada y su sintaxis es
import nombre_paqueteNombre_Clase
Esta sentencia o grupo de ellas deben aparecer antes de cualquier declaracion de claseen el codigo fuente
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1149
Herramientas y Lenguajes de Programacion 06-07 9
124 Documentacion
La herramienta javadoc genera paginas HTML de documentacion del API a partir deficheros con codigo fuente Java
En la lınea de comandos se le puede pasar a javadoc una serie de paquetes o ficherosJava para los que se desea generar documentacion Se genera documentacion para el pa-quete especificado o para los ficheros fuentes Java individuales que se listen en la lınea decomandos Se genera un fichero html por cada fichero java que se encuentre Tambiense genera la jerarquıa de clases (treehtml) y un ındice con todos los miembros que hadetectado (AllNameshtml)
La utilidad javadoc extrae informacion de los siguiente elementos
Paquetes
Clases e interfaces publicas
Metodos publicos y protegidos
Datos publicos y protegidos
Se puede anadir documentacion para todos estos entes a traves de comentarios dedocumentacion en el codigo fuente Estos comentarios pueden incluir marcas HTML Uncomentario de documentacion esta formado por todos los caracteres incluidos entre queindica el comienzo del comentario y que indica el final En todas las lıneas intermediaslos caracteres a la izquierda se ignoran y tambien todos los espacios y tabuladores queprecedan a ese caracter
Este es un comentario de documentacion
Se pueden incluir etiquetas HTML dentro de un comentario de documentacion aunqueno deben utilizarse las etiquetas lth1gt lth2gt o lıneas horizontales lthrgt porque javadoc
crea una estructura completa para el documento y estas marcas interfieren con el formatogeneral de ese documento
Cada comentario de documentacion puede incluir texto libre seguido de etiquetas de
documentaciacute on Estas etiquetas comienzan siempre con el signo y deben situarse alprincipio de la lınea (tener en cuenta que todo lo que haya hasta el primer caracter se ignora) y todas las etiquetas con el mismo nombre deben agruparse juntas dentro delcomentario de documentacion
Marcas de documentacion de clases e interface
see nombre_de_clase
Anade un enlace a la clase especificada en la zona ldquoSee Alsordquo Por ejemplo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1249
Herramientas y Lenguajes de Programacion 06-07 10
see javalangString
see Stringsee Stringequals
see javalangObjectwaint(int)
see CharacterMAX_RADIX
see lta href=spechtmlgtEspecif Javaltagt
Se utiliza el caracter para separar el nombre de una clase del nombre de uno desus campos de datos metodos o constructores
version texto-version
Anade una entrada ldquoVersionrdquo El texto no tiene que tener formato especial
author texto-autor
Anade una entrada ldquoAuthorrdquo El texto no tiene que tener formato especial
since texto
Este texto no tiene una estructura especial Se utiliza para indicar desde que fechao desde que version se ha introducido el cambio o caracterıstica que indica el texto
deprecated texto
Anade un comentario indicando que el metodo esta desautorizado y no deberıa uti-lizarse porque puede dejar de ser soportada por el API La convencion que se siguees indicar en el texto la funcion o metodo por quien se ha sustituido Ejemplo decomentario de una clase
Clase que representa la figura geometrica cilindro
Por ejemplo
ltPREgt
Cilindro c = new Cilindro(10)
double d = cvolumen()
ltPREgt
see figurasCirculo
see figurasObjetoGeometrico
version 15 14 Mar 04
author Coromoto Leon Hernandez
public class Cilindro extends Circulo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1349
Herramientas y Lenguajes de Programacion 06-07 11
Marcas de documentacion de campos de datos
La unica marca especial que se puede incluir es la marca see Ejemplo de comentariode un campo de datos
El palo de bastos
public static final int BASTOS = 1
Marcas de documentacion de constructores y metodos
Pueden ser marcas see y ademas
param parametro descripcion
Anade un parametro a la seccion ldquoParametersrdquo La descripcion puede continuar enla lınea siguiente
return descripcion
Anade una seccion ldquoReturnrdquo que debe contener la descripcion del valor a devolver
throws exception descripcion
Anade una entrada ldquoThrowsrdquo que contiene el nombre de la excepcion que puede ser
lanzada por el metodo La excepcion estara enlazada con su clase en la documenta-cion
see nombre_de_clase
Anade un enlace a la clase en la zona ldquoSee Alsordquo
since texto
Indica desde que fecha o desde que version se ha introducido el cambio o caracterısticaque indica el texto
deprecated texto
Indica que no deberıa utilizarse el metodo porque esta desautorizado y puede dejarde ser soportado por el API en cualquier momento Ejemplo de comentario de unmetodo
Devuelve el caracter de la posicion indicada entre
ltttgt0ltttgt y ltttgtlength()-1ltttgt
param indice La posicion del caracter a obtener
return El caracter situado en la posicion
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1449
Herramientas y Lenguajes de Programacion 06-07 12
Figura 14 Evolucion de la metodologıa de programacion
exception StringIndexOutOfRangeException
Se prodcue cuando el indice no esta en el rango ltttgt0ltttgt a ltttgtlength()-1ltttgt
public char charAt( int indice )
13 Lenguajes de Programacion
El debate en este caso se centra en la programacion orientada a objetos frente a laprogramacion tradicional La Figura 14 muestra la evolucion de la metodologıa de la
programacion desde los primeros tiempos de la informatica hasta hoyEn la historia de la programacion ha habido varias evoluciones sucesivas Una de lasprincipales fue la programacion estructurada cuyo principio fundamental era dividir unprograma en subprogramas mas pequenos y faciles de resolver hasta llegar a niveles decomplejidad elementales siempre apoyandose en la idea de iquestQue debe hacer el programa
Este metodo de diseno a pesar de haber dado resultados satisfactorios tiene limita-ciones Algunas de ellas son
No favorece la reulitizacion del codigo
Si en la figura anterior fn1 y fn2 fueran identicas este hecho seguramente pasarıadesapercibido y no se compartirıa una unica funcion fn
Si dos subprogramas comparten una misma funcion fn reutilizando ası el codigo quedefine la misma y mas adelante queremos modificar fn porque hay un cambio enuno de los subprogramas que la utilizan la modificacion afectara tambien al otrosubprograma razon por la que ahora tendremos que realizar dos funciones
Por lo tanto se tiene que la programacion tradicional se desarrolla a partir de proce-dimientos y datos sin delimitar que procedimientos actuan sobre que datos
El diseno orientado a objetos se interesa en primer lugar por los datos a los que seasocian posteriormente procedimientos En este caso la idea principal es iquestde que trata el
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1549
Herramientas y Lenguajes de Programacion 06-07 13
programa Ası que el desarrollo se organiza en torno a los datos y no a como se debefuncionar
En la programacion orientada a objetos un programa es una coleccion de una solaentidad basica el objeto el cual combina los datos con los procedimientos que actuan
sobre ellos Durante la ejecucion los ob jetos reciben y envıan mensajes a otros objetospara ejecutar las acciones requeridas
La programacion orientada a objetos se puede llevar a cabo con lenguajes convenciona-les pero esto exige al programador la construccion de los mecanismos de que disponen loslenguajes orientados a objetos tales como objetos clases metodos mensajes herenciaetc
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1649
Herramientas y Lenguajes de Programacion 06-07 14
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1749
Capıtulo 2
Programas Java Aplicaciones
El objetivo de este ejercicio practico es mostrar el modo de funcionamiento de losdistintos tipos de programas Java En este caso se abordar an las aplicaciones
21 Ejemplo de aplicacion
El codigo que aparece a continuacion implementa en Java la aplicacion que muestraen la terminal la frase ldquoHola Mundo en Javardquo
1
2 Applicacion Simple3
4 class AplicacionSimple
5 public static void main(String[] args)
6 Systemoutprintln(Hola Mundo en Java)
7
8
El primer paso para manipular una aplicacion Java es compilarla ejecutando en la lıneade comandos la instruccion
gtjavac AplicacionSimplejava
Es importante que el nombre del fichero que contiene el c odigo coincida exactamentecon el nombre de la clase que aparece en la lınea numero 3
Al realizar este paso se obtiene un fichero AplicacionSimpleclass Para ejecutar la aplicacion escribimos en la lınea de comandos
gtjava AplicacionSimple
y obtenemos el resultado que aparece en la figura 21
15
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1849
Herramientas y Lenguajes de Programacion 06-07 16
Figura 21 Ejecucion de la aplicacion
22 Ejercicios
1 Compile y ejecute el ejemplo de aplicacion
2 Escriba una aplicacion Java que
Contemple la creacion de una clase (Clase1) que contengan un atributo enteroy metodos para establecer y recuperar los valores de dicho atributo
Definir una segunda clase (Clase2) con un atributo que es un objeto de la
Clase1 y con un metodo que establece diez valores diferentes en el atributo dela Clase1
Definir una tercera clase (Clase3) con un atributo que es un objeto de la Clase1
y con un metodo que recupera diez valores del atributo de la Clase1
Finalmente crear una clase de prueba donde se instancien objetos de las clasesanteriores y se invoque a sus metodos
3 Escriba la jerarquıa de clases del programa que ha desarrollado
4 Dibuje una traza del flujo de ejecucion de la aplicacion
5 Comente sus clases utilizando javadoc genere ficheros de descripcion de su clase
similares a los de la documentacion de las API de Java
En el documento de descripcion de la herramienta Javadoc puede encontrar la formade uso de las distintas etiquetas disponibles
see author version param return
(conexion a javasuncom )
Ejecute el comando javadoc desde la lınea de comandos sin ningun argumento yobtendra una lista de las opciones con las que puede llamar a la herramienta
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1949
Herramientas y Lenguajes de Programacion 06-07 17
Notese que para que aparezcan en el fichero html los comentarios asociados a los
campos de datos privados tiene que compilarlos con la opcion -privateDe la misma forma para que aparezcan el autor y la versi on se han de utilizar lasopciones -author y -version
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2049
Capıtulo 3
Programas Java applets
El objetivo de esta practica es mostrar el modo de funcionamiento de los distintos tiposde programas Java En esta practica se abordaran los applets
31 Ejemplo de applet
El codigo que aparece a continuacion muestra la implementacion en Java del programaque muestra en la ventana principal del navegador la frase ldquoHola Mundo en Javardquo
Applet Sencillo
import javaappletApplet
import javaawtGraphics
public class AppletSimple extends Applet
public void paint(Graphics g)
gdrawString(Hola Mundo en Java 50 25)
El primer paso para manipular un applet Java es compilarlo ejecutando en la lınea decomandos la instruccion
gtjavac AppletSimplejava
Al realizar este paso se obtiene una fichero AppletSimpleclassEl fichero class resultante de la compilacion se ha de incrustar en un fichero para
ser ejecutado por un navegadorEn este caso las etiquetas a utilizar son ltAPPLETgt y ltAPPLETgt
18
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1149
Herramientas y Lenguajes de Programacion 06-07 9
124 Documentacion
La herramienta javadoc genera paginas HTML de documentacion del API a partir deficheros con codigo fuente Java
En la lınea de comandos se le puede pasar a javadoc una serie de paquetes o ficherosJava para los que se desea generar documentacion Se genera documentacion para el pa-quete especificado o para los ficheros fuentes Java individuales que se listen en la lınea decomandos Se genera un fichero html por cada fichero java que se encuentre Tambiense genera la jerarquıa de clases (treehtml) y un ındice con todos los miembros que hadetectado (AllNameshtml)
La utilidad javadoc extrae informacion de los siguiente elementos
Paquetes
Clases e interfaces publicas
Metodos publicos y protegidos
Datos publicos y protegidos
Se puede anadir documentacion para todos estos entes a traves de comentarios dedocumentacion en el codigo fuente Estos comentarios pueden incluir marcas HTML Uncomentario de documentacion esta formado por todos los caracteres incluidos entre queindica el comienzo del comentario y que indica el final En todas las lıneas intermediaslos caracteres a la izquierda se ignoran y tambien todos los espacios y tabuladores queprecedan a ese caracter
Este es un comentario de documentacion
Se pueden incluir etiquetas HTML dentro de un comentario de documentacion aunqueno deben utilizarse las etiquetas lth1gt lth2gt o lıneas horizontales lthrgt porque javadoc
crea una estructura completa para el documento y estas marcas interfieren con el formatogeneral de ese documento
Cada comentario de documentacion puede incluir texto libre seguido de etiquetas de
documentaciacute on Estas etiquetas comienzan siempre con el signo y deben situarse alprincipio de la lınea (tener en cuenta que todo lo que haya hasta el primer caracter se ignora) y todas las etiquetas con el mismo nombre deben agruparse juntas dentro delcomentario de documentacion
Marcas de documentacion de clases e interface
see nombre_de_clase
Anade un enlace a la clase especificada en la zona ldquoSee Alsordquo Por ejemplo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1249
Herramientas y Lenguajes de Programacion 06-07 10
see javalangString
see Stringsee Stringequals
see javalangObjectwaint(int)
see CharacterMAX_RADIX
see lta href=spechtmlgtEspecif Javaltagt
Se utiliza el caracter para separar el nombre de una clase del nombre de uno desus campos de datos metodos o constructores
version texto-version
Anade una entrada ldquoVersionrdquo El texto no tiene que tener formato especial
author texto-autor
Anade una entrada ldquoAuthorrdquo El texto no tiene que tener formato especial
since texto
Este texto no tiene una estructura especial Se utiliza para indicar desde que fechao desde que version se ha introducido el cambio o caracterıstica que indica el texto
deprecated texto
Anade un comentario indicando que el metodo esta desautorizado y no deberıa uti-lizarse porque puede dejar de ser soportada por el API La convencion que se siguees indicar en el texto la funcion o metodo por quien se ha sustituido Ejemplo decomentario de una clase
Clase que representa la figura geometrica cilindro
Por ejemplo
ltPREgt
Cilindro c = new Cilindro(10)
double d = cvolumen()
ltPREgt
see figurasCirculo
see figurasObjetoGeometrico
version 15 14 Mar 04
author Coromoto Leon Hernandez
public class Cilindro extends Circulo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1349
Herramientas y Lenguajes de Programacion 06-07 11
Marcas de documentacion de campos de datos
La unica marca especial que se puede incluir es la marca see Ejemplo de comentariode un campo de datos
El palo de bastos
public static final int BASTOS = 1
Marcas de documentacion de constructores y metodos
Pueden ser marcas see y ademas
param parametro descripcion
Anade un parametro a la seccion ldquoParametersrdquo La descripcion puede continuar enla lınea siguiente
return descripcion
Anade una seccion ldquoReturnrdquo que debe contener la descripcion del valor a devolver
throws exception descripcion
Anade una entrada ldquoThrowsrdquo que contiene el nombre de la excepcion que puede ser
lanzada por el metodo La excepcion estara enlazada con su clase en la documenta-cion
see nombre_de_clase
Anade un enlace a la clase en la zona ldquoSee Alsordquo
since texto
Indica desde que fecha o desde que version se ha introducido el cambio o caracterısticaque indica el texto
deprecated texto
Indica que no deberıa utilizarse el metodo porque esta desautorizado y puede dejarde ser soportado por el API en cualquier momento Ejemplo de comentario de unmetodo
Devuelve el caracter de la posicion indicada entre
ltttgt0ltttgt y ltttgtlength()-1ltttgt
param indice La posicion del caracter a obtener
return El caracter situado en la posicion
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1449
Herramientas y Lenguajes de Programacion 06-07 12
Figura 14 Evolucion de la metodologıa de programacion
exception StringIndexOutOfRangeException
Se prodcue cuando el indice no esta en el rango ltttgt0ltttgt a ltttgtlength()-1ltttgt
public char charAt( int indice )
13 Lenguajes de Programacion
El debate en este caso se centra en la programacion orientada a objetos frente a laprogramacion tradicional La Figura 14 muestra la evolucion de la metodologıa de la
programacion desde los primeros tiempos de la informatica hasta hoyEn la historia de la programacion ha habido varias evoluciones sucesivas Una de lasprincipales fue la programacion estructurada cuyo principio fundamental era dividir unprograma en subprogramas mas pequenos y faciles de resolver hasta llegar a niveles decomplejidad elementales siempre apoyandose en la idea de iquestQue debe hacer el programa
Este metodo de diseno a pesar de haber dado resultados satisfactorios tiene limita-ciones Algunas de ellas son
No favorece la reulitizacion del codigo
Si en la figura anterior fn1 y fn2 fueran identicas este hecho seguramente pasarıadesapercibido y no se compartirıa una unica funcion fn
Si dos subprogramas comparten una misma funcion fn reutilizando ası el codigo quedefine la misma y mas adelante queremos modificar fn porque hay un cambio enuno de los subprogramas que la utilizan la modificacion afectara tambien al otrosubprograma razon por la que ahora tendremos que realizar dos funciones
Por lo tanto se tiene que la programacion tradicional se desarrolla a partir de proce-dimientos y datos sin delimitar que procedimientos actuan sobre que datos
El diseno orientado a objetos se interesa en primer lugar por los datos a los que seasocian posteriormente procedimientos En este caso la idea principal es iquestde que trata el
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1549
Herramientas y Lenguajes de Programacion 06-07 13
programa Ası que el desarrollo se organiza en torno a los datos y no a como se debefuncionar
En la programacion orientada a objetos un programa es una coleccion de una solaentidad basica el objeto el cual combina los datos con los procedimientos que actuan
sobre ellos Durante la ejecucion los ob jetos reciben y envıan mensajes a otros objetospara ejecutar las acciones requeridas
La programacion orientada a objetos se puede llevar a cabo con lenguajes convenciona-les pero esto exige al programador la construccion de los mecanismos de que disponen loslenguajes orientados a objetos tales como objetos clases metodos mensajes herenciaetc
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1649
Herramientas y Lenguajes de Programacion 06-07 14
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1749
Capıtulo 2
Programas Java Aplicaciones
El objetivo de este ejercicio practico es mostrar el modo de funcionamiento de losdistintos tipos de programas Java En este caso se abordar an las aplicaciones
21 Ejemplo de aplicacion
El codigo que aparece a continuacion implementa en Java la aplicacion que muestraen la terminal la frase ldquoHola Mundo en Javardquo
1
2 Applicacion Simple3
4 class AplicacionSimple
5 public static void main(String[] args)
6 Systemoutprintln(Hola Mundo en Java)
7
8
El primer paso para manipular una aplicacion Java es compilarla ejecutando en la lıneade comandos la instruccion
gtjavac AplicacionSimplejava
Es importante que el nombre del fichero que contiene el c odigo coincida exactamentecon el nombre de la clase que aparece en la lınea numero 3
Al realizar este paso se obtiene un fichero AplicacionSimpleclass Para ejecutar la aplicacion escribimos en la lınea de comandos
gtjava AplicacionSimple
y obtenemos el resultado que aparece en la figura 21
15
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1849
Herramientas y Lenguajes de Programacion 06-07 16
Figura 21 Ejecucion de la aplicacion
22 Ejercicios
1 Compile y ejecute el ejemplo de aplicacion
2 Escriba una aplicacion Java que
Contemple la creacion de una clase (Clase1) que contengan un atributo enteroy metodos para establecer y recuperar los valores de dicho atributo
Definir una segunda clase (Clase2) con un atributo que es un objeto de la
Clase1 y con un metodo que establece diez valores diferentes en el atributo dela Clase1
Definir una tercera clase (Clase3) con un atributo que es un objeto de la Clase1
y con un metodo que recupera diez valores del atributo de la Clase1
Finalmente crear una clase de prueba donde se instancien objetos de las clasesanteriores y se invoque a sus metodos
3 Escriba la jerarquıa de clases del programa que ha desarrollado
4 Dibuje una traza del flujo de ejecucion de la aplicacion
5 Comente sus clases utilizando javadoc genere ficheros de descripcion de su clase
similares a los de la documentacion de las API de Java
En el documento de descripcion de la herramienta Javadoc puede encontrar la formade uso de las distintas etiquetas disponibles
see author version param return
(conexion a javasuncom )
Ejecute el comando javadoc desde la lınea de comandos sin ningun argumento yobtendra una lista de las opciones con las que puede llamar a la herramienta
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1949
Herramientas y Lenguajes de Programacion 06-07 17
Notese que para que aparezcan en el fichero html los comentarios asociados a los
campos de datos privados tiene que compilarlos con la opcion -privateDe la misma forma para que aparezcan el autor y la versi on se han de utilizar lasopciones -author y -version
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2049
Capıtulo 3
Programas Java applets
El objetivo de esta practica es mostrar el modo de funcionamiento de los distintos tiposde programas Java En esta practica se abordaran los applets
31 Ejemplo de applet
El codigo que aparece a continuacion muestra la implementacion en Java del programaque muestra en la ventana principal del navegador la frase ldquoHola Mundo en Javardquo
Applet Sencillo
import javaappletApplet
import javaawtGraphics
public class AppletSimple extends Applet
public void paint(Graphics g)
gdrawString(Hola Mundo en Java 50 25)
El primer paso para manipular un applet Java es compilarlo ejecutando en la lınea decomandos la instruccion
gtjavac AppletSimplejava
Al realizar este paso se obtiene una fichero AppletSimpleclassEl fichero class resultante de la compilacion se ha de incrustar en un fichero para
ser ejecutado por un navegadorEn este caso las etiquetas a utilizar son ltAPPLETgt y ltAPPLETgt
18
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1249
Herramientas y Lenguajes de Programacion 06-07 10
see javalangString
see Stringsee Stringequals
see javalangObjectwaint(int)
see CharacterMAX_RADIX
see lta href=spechtmlgtEspecif Javaltagt
Se utiliza el caracter para separar el nombre de una clase del nombre de uno desus campos de datos metodos o constructores
version texto-version
Anade una entrada ldquoVersionrdquo El texto no tiene que tener formato especial
author texto-autor
Anade una entrada ldquoAuthorrdquo El texto no tiene que tener formato especial
since texto
Este texto no tiene una estructura especial Se utiliza para indicar desde que fechao desde que version se ha introducido el cambio o caracterıstica que indica el texto
deprecated texto
Anade un comentario indicando que el metodo esta desautorizado y no deberıa uti-lizarse porque puede dejar de ser soportada por el API La convencion que se siguees indicar en el texto la funcion o metodo por quien se ha sustituido Ejemplo decomentario de una clase
Clase que representa la figura geometrica cilindro
Por ejemplo
ltPREgt
Cilindro c = new Cilindro(10)
double d = cvolumen()
ltPREgt
see figurasCirculo
see figurasObjetoGeometrico
version 15 14 Mar 04
author Coromoto Leon Hernandez
public class Cilindro extends Circulo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1349
Herramientas y Lenguajes de Programacion 06-07 11
Marcas de documentacion de campos de datos
La unica marca especial que se puede incluir es la marca see Ejemplo de comentariode un campo de datos
El palo de bastos
public static final int BASTOS = 1
Marcas de documentacion de constructores y metodos
Pueden ser marcas see y ademas
param parametro descripcion
Anade un parametro a la seccion ldquoParametersrdquo La descripcion puede continuar enla lınea siguiente
return descripcion
Anade una seccion ldquoReturnrdquo que debe contener la descripcion del valor a devolver
throws exception descripcion
Anade una entrada ldquoThrowsrdquo que contiene el nombre de la excepcion que puede ser
lanzada por el metodo La excepcion estara enlazada con su clase en la documenta-cion
see nombre_de_clase
Anade un enlace a la clase en la zona ldquoSee Alsordquo
since texto
Indica desde que fecha o desde que version se ha introducido el cambio o caracterısticaque indica el texto
deprecated texto
Indica que no deberıa utilizarse el metodo porque esta desautorizado y puede dejarde ser soportado por el API en cualquier momento Ejemplo de comentario de unmetodo
Devuelve el caracter de la posicion indicada entre
ltttgt0ltttgt y ltttgtlength()-1ltttgt
param indice La posicion del caracter a obtener
return El caracter situado en la posicion
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1449
Herramientas y Lenguajes de Programacion 06-07 12
Figura 14 Evolucion de la metodologıa de programacion
exception StringIndexOutOfRangeException
Se prodcue cuando el indice no esta en el rango ltttgt0ltttgt a ltttgtlength()-1ltttgt
public char charAt( int indice )
13 Lenguajes de Programacion
El debate en este caso se centra en la programacion orientada a objetos frente a laprogramacion tradicional La Figura 14 muestra la evolucion de la metodologıa de la
programacion desde los primeros tiempos de la informatica hasta hoyEn la historia de la programacion ha habido varias evoluciones sucesivas Una de lasprincipales fue la programacion estructurada cuyo principio fundamental era dividir unprograma en subprogramas mas pequenos y faciles de resolver hasta llegar a niveles decomplejidad elementales siempre apoyandose en la idea de iquestQue debe hacer el programa
Este metodo de diseno a pesar de haber dado resultados satisfactorios tiene limita-ciones Algunas de ellas son
No favorece la reulitizacion del codigo
Si en la figura anterior fn1 y fn2 fueran identicas este hecho seguramente pasarıadesapercibido y no se compartirıa una unica funcion fn
Si dos subprogramas comparten una misma funcion fn reutilizando ası el codigo quedefine la misma y mas adelante queremos modificar fn porque hay un cambio enuno de los subprogramas que la utilizan la modificacion afectara tambien al otrosubprograma razon por la que ahora tendremos que realizar dos funciones
Por lo tanto se tiene que la programacion tradicional se desarrolla a partir de proce-dimientos y datos sin delimitar que procedimientos actuan sobre que datos
El diseno orientado a objetos se interesa en primer lugar por los datos a los que seasocian posteriormente procedimientos En este caso la idea principal es iquestde que trata el
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1549
Herramientas y Lenguajes de Programacion 06-07 13
programa Ası que el desarrollo se organiza en torno a los datos y no a como se debefuncionar
En la programacion orientada a objetos un programa es una coleccion de una solaentidad basica el objeto el cual combina los datos con los procedimientos que actuan
sobre ellos Durante la ejecucion los ob jetos reciben y envıan mensajes a otros objetospara ejecutar las acciones requeridas
La programacion orientada a objetos se puede llevar a cabo con lenguajes convenciona-les pero esto exige al programador la construccion de los mecanismos de que disponen loslenguajes orientados a objetos tales como objetos clases metodos mensajes herenciaetc
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1649
Herramientas y Lenguajes de Programacion 06-07 14
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1749
Capıtulo 2
Programas Java Aplicaciones
El objetivo de este ejercicio practico es mostrar el modo de funcionamiento de losdistintos tipos de programas Java En este caso se abordar an las aplicaciones
21 Ejemplo de aplicacion
El codigo que aparece a continuacion implementa en Java la aplicacion que muestraen la terminal la frase ldquoHola Mundo en Javardquo
1
2 Applicacion Simple3
4 class AplicacionSimple
5 public static void main(String[] args)
6 Systemoutprintln(Hola Mundo en Java)
7
8
El primer paso para manipular una aplicacion Java es compilarla ejecutando en la lıneade comandos la instruccion
gtjavac AplicacionSimplejava
Es importante que el nombre del fichero que contiene el c odigo coincida exactamentecon el nombre de la clase que aparece en la lınea numero 3
Al realizar este paso se obtiene un fichero AplicacionSimpleclass Para ejecutar la aplicacion escribimos en la lınea de comandos
gtjava AplicacionSimple
y obtenemos el resultado que aparece en la figura 21
15
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1849
Herramientas y Lenguajes de Programacion 06-07 16
Figura 21 Ejecucion de la aplicacion
22 Ejercicios
1 Compile y ejecute el ejemplo de aplicacion
2 Escriba una aplicacion Java que
Contemple la creacion de una clase (Clase1) que contengan un atributo enteroy metodos para establecer y recuperar los valores de dicho atributo
Definir una segunda clase (Clase2) con un atributo que es un objeto de la
Clase1 y con un metodo que establece diez valores diferentes en el atributo dela Clase1
Definir una tercera clase (Clase3) con un atributo que es un objeto de la Clase1
y con un metodo que recupera diez valores del atributo de la Clase1
Finalmente crear una clase de prueba donde se instancien objetos de las clasesanteriores y se invoque a sus metodos
3 Escriba la jerarquıa de clases del programa que ha desarrollado
4 Dibuje una traza del flujo de ejecucion de la aplicacion
5 Comente sus clases utilizando javadoc genere ficheros de descripcion de su clase
similares a los de la documentacion de las API de Java
En el documento de descripcion de la herramienta Javadoc puede encontrar la formade uso de las distintas etiquetas disponibles
see author version param return
(conexion a javasuncom )
Ejecute el comando javadoc desde la lınea de comandos sin ningun argumento yobtendra una lista de las opciones con las que puede llamar a la herramienta
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1949
Herramientas y Lenguajes de Programacion 06-07 17
Notese que para que aparezcan en el fichero html los comentarios asociados a los
campos de datos privados tiene que compilarlos con la opcion -privateDe la misma forma para que aparezcan el autor y la versi on se han de utilizar lasopciones -author y -version
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2049
Capıtulo 3
Programas Java applets
El objetivo de esta practica es mostrar el modo de funcionamiento de los distintos tiposde programas Java En esta practica se abordaran los applets
31 Ejemplo de applet
El codigo que aparece a continuacion muestra la implementacion en Java del programaque muestra en la ventana principal del navegador la frase ldquoHola Mundo en Javardquo
Applet Sencillo
import javaappletApplet
import javaawtGraphics
public class AppletSimple extends Applet
public void paint(Graphics g)
gdrawString(Hola Mundo en Java 50 25)
El primer paso para manipular un applet Java es compilarlo ejecutando en la lınea decomandos la instruccion
gtjavac AppletSimplejava
Al realizar este paso se obtiene una fichero AppletSimpleclassEl fichero class resultante de la compilacion se ha de incrustar en un fichero para
ser ejecutado por un navegadorEn este caso las etiquetas a utilizar son ltAPPLETgt y ltAPPLETgt
18
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1349
Herramientas y Lenguajes de Programacion 06-07 11
Marcas de documentacion de campos de datos
La unica marca especial que se puede incluir es la marca see Ejemplo de comentariode un campo de datos
El palo de bastos
public static final int BASTOS = 1
Marcas de documentacion de constructores y metodos
Pueden ser marcas see y ademas
param parametro descripcion
Anade un parametro a la seccion ldquoParametersrdquo La descripcion puede continuar enla lınea siguiente
return descripcion
Anade una seccion ldquoReturnrdquo que debe contener la descripcion del valor a devolver
throws exception descripcion
Anade una entrada ldquoThrowsrdquo que contiene el nombre de la excepcion que puede ser
lanzada por el metodo La excepcion estara enlazada con su clase en la documenta-cion
see nombre_de_clase
Anade un enlace a la clase en la zona ldquoSee Alsordquo
since texto
Indica desde que fecha o desde que version se ha introducido el cambio o caracterısticaque indica el texto
deprecated texto
Indica que no deberıa utilizarse el metodo porque esta desautorizado y puede dejarde ser soportado por el API en cualquier momento Ejemplo de comentario de unmetodo
Devuelve el caracter de la posicion indicada entre
ltttgt0ltttgt y ltttgtlength()-1ltttgt
param indice La posicion del caracter a obtener
return El caracter situado en la posicion
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1449
Herramientas y Lenguajes de Programacion 06-07 12
Figura 14 Evolucion de la metodologıa de programacion
exception StringIndexOutOfRangeException
Se prodcue cuando el indice no esta en el rango ltttgt0ltttgt a ltttgtlength()-1ltttgt
public char charAt( int indice )
13 Lenguajes de Programacion
El debate en este caso se centra en la programacion orientada a objetos frente a laprogramacion tradicional La Figura 14 muestra la evolucion de la metodologıa de la
programacion desde los primeros tiempos de la informatica hasta hoyEn la historia de la programacion ha habido varias evoluciones sucesivas Una de lasprincipales fue la programacion estructurada cuyo principio fundamental era dividir unprograma en subprogramas mas pequenos y faciles de resolver hasta llegar a niveles decomplejidad elementales siempre apoyandose en la idea de iquestQue debe hacer el programa
Este metodo de diseno a pesar de haber dado resultados satisfactorios tiene limita-ciones Algunas de ellas son
No favorece la reulitizacion del codigo
Si en la figura anterior fn1 y fn2 fueran identicas este hecho seguramente pasarıadesapercibido y no se compartirıa una unica funcion fn
Si dos subprogramas comparten una misma funcion fn reutilizando ası el codigo quedefine la misma y mas adelante queremos modificar fn porque hay un cambio enuno de los subprogramas que la utilizan la modificacion afectara tambien al otrosubprograma razon por la que ahora tendremos que realizar dos funciones
Por lo tanto se tiene que la programacion tradicional se desarrolla a partir de proce-dimientos y datos sin delimitar que procedimientos actuan sobre que datos
El diseno orientado a objetos se interesa en primer lugar por los datos a los que seasocian posteriormente procedimientos En este caso la idea principal es iquestde que trata el
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1549
Herramientas y Lenguajes de Programacion 06-07 13
programa Ası que el desarrollo se organiza en torno a los datos y no a como se debefuncionar
En la programacion orientada a objetos un programa es una coleccion de una solaentidad basica el objeto el cual combina los datos con los procedimientos que actuan
sobre ellos Durante la ejecucion los ob jetos reciben y envıan mensajes a otros objetospara ejecutar las acciones requeridas
La programacion orientada a objetos se puede llevar a cabo con lenguajes convenciona-les pero esto exige al programador la construccion de los mecanismos de que disponen loslenguajes orientados a objetos tales como objetos clases metodos mensajes herenciaetc
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1649
Herramientas y Lenguajes de Programacion 06-07 14
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1749
Capıtulo 2
Programas Java Aplicaciones
El objetivo de este ejercicio practico es mostrar el modo de funcionamiento de losdistintos tipos de programas Java En este caso se abordar an las aplicaciones
21 Ejemplo de aplicacion
El codigo que aparece a continuacion implementa en Java la aplicacion que muestraen la terminal la frase ldquoHola Mundo en Javardquo
1
2 Applicacion Simple3
4 class AplicacionSimple
5 public static void main(String[] args)
6 Systemoutprintln(Hola Mundo en Java)
7
8
El primer paso para manipular una aplicacion Java es compilarla ejecutando en la lıneade comandos la instruccion
gtjavac AplicacionSimplejava
Es importante que el nombre del fichero que contiene el c odigo coincida exactamentecon el nombre de la clase que aparece en la lınea numero 3
Al realizar este paso se obtiene un fichero AplicacionSimpleclass Para ejecutar la aplicacion escribimos en la lınea de comandos
gtjava AplicacionSimple
y obtenemos el resultado que aparece en la figura 21
15
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1849
Herramientas y Lenguajes de Programacion 06-07 16
Figura 21 Ejecucion de la aplicacion
22 Ejercicios
1 Compile y ejecute el ejemplo de aplicacion
2 Escriba una aplicacion Java que
Contemple la creacion de una clase (Clase1) que contengan un atributo enteroy metodos para establecer y recuperar los valores de dicho atributo
Definir una segunda clase (Clase2) con un atributo que es un objeto de la
Clase1 y con un metodo que establece diez valores diferentes en el atributo dela Clase1
Definir una tercera clase (Clase3) con un atributo que es un objeto de la Clase1
y con un metodo que recupera diez valores del atributo de la Clase1
Finalmente crear una clase de prueba donde se instancien objetos de las clasesanteriores y se invoque a sus metodos
3 Escriba la jerarquıa de clases del programa que ha desarrollado
4 Dibuje una traza del flujo de ejecucion de la aplicacion
5 Comente sus clases utilizando javadoc genere ficheros de descripcion de su clase
similares a los de la documentacion de las API de Java
En el documento de descripcion de la herramienta Javadoc puede encontrar la formade uso de las distintas etiquetas disponibles
see author version param return
(conexion a javasuncom )
Ejecute el comando javadoc desde la lınea de comandos sin ningun argumento yobtendra una lista de las opciones con las que puede llamar a la herramienta
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1949
Herramientas y Lenguajes de Programacion 06-07 17
Notese que para que aparezcan en el fichero html los comentarios asociados a los
campos de datos privados tiene que compilarlos con la opcion -privateDe la misma forma para que aparezcan el autor y la versi on se han de utilizar lasopciones -author y -version
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2049
Capıtulo 3
Programas Java applets
El objetivo de esta practica es mostrar el modo de funcionamiento de los distintos tiposde programas Java En esta practica se abordaran los applets
31 Ejemplo de applet
El codigo que aparece a continuacion muestra la implementacion en Java del programaque muestra en la ventana principal del navegador la frase ldquoHola Mundo en Javardquo
Applet Sencillo
import javaappletApplet
import javaawtGraphics
public class AppletSimple extends Applet
public void paint(Graphics g)
gdrawString(Hola Mundo en Java 50 25)
El primer paso para manipular un applet Java es compilarlo ejecutando en la lınea decomandos la instruccion
gtjavac AppletSimplejava
Al realizar este paso se obtiene una fichero AppletSimpleclassEl fichero class resultante de la compilacion se ha de incrustar en un fichero para
ser ejecutado por un navegadorEn este caso las etiquetas a utilizar son ltAPPLETgt y ltAPPLETgt
18
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1449
Herramientas y Lenguajes de Programacion 06-07 12
Figura 14 Evolucion de la metodologıa de programacion
exception StringIndexOutOfRangeException
Se prodcue cuando el indice no esta en el rango ltttgt0ltttgt a ltttgtlength()-1ltttgt
public char charAt( int indice )
13 Lenguajes de Programacion
El debate en este caso se centra en la programacion orientada a objetos frente a laprogramacion tradicional La Figura 14 muestra la evolucion de la metodologıa de la
programacion desde los primeros tiempos de la informatica hasta hoyEn la historia de la programacion ha habido varias evoluciones sucesivas Una de lasprincipales fue la programacion estructurada cuyo principio fundamental era dividir unprograma en subprogramas mas pequenos y faciles de resolver hasta llegar a niveles decomplejidad elementales siempre apoyandose en la idea de iquestQue debe hacer el programa
Este metodo de diseno a pesar de haber dado resultados satisfactorios tiene limita-ciones Algunas de ellas son
No favorece la reulitizacion del codigo
Si en la figura anterior fn1 y fn2 fueran identicas este hecho seguramente pasarıadesapercibido y no se compartirıa una unica funcion fn
Si dos subprogramas comparten una misma funcion fn reutilizando ası el codigo quedefine la misma y mas adelante queremos modificar fn porque hay un cambio enuno de los subprogramas que la utilizan la modificacion afectara tambien al otrosubprograma razon por la que ahora tendremos que realizar dos funciones
Por lo tanto se tiene que la programacion tradicional se desarrolla a partir de proce-dimientos y datos sin delimitar que procedimientos actuan sobre que datos
El diseno orientado a objetos se interesa en primer lugar por los datos a los que seasocian posteriormente procedimientos En este caso la idea principal es iquestde que trata el
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1549
Herramientas y Lenguajes de Programacion 06-07 13
programa Ası que el desarrollo se organiza en torno a los datos y no a como se debefuncionar
En la programacion orientada a objetos un programa es una coleccion de una solaentidad basica el objeto el cual combina los datos con los procedimientos que actuan
sobre ellos Durante la ejecucion los ob jetos reciben y envıan mensajes a otros objetospara ejecutar las acciones requeridas
La programacion orientada a objetos se puede llevar a cabo con lenguajes convenciona-les pero esto exige al programador la construccion de los mecanismos de que disponen loslenguajes orientados a objetos tales como objetos clases metodos mensajes herenciaetc
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1649
Herramientas y Lenguajes de Programacion 06-07 14
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1749
Capıtulo 2
Programas Java Aplicaciones
El objetivo de este ejercicio practico es mostrar el modo de funcionamiento de losdistintos tipos de programas Java En este caso se abordar an las aplicaciones
21 Ejemplo de aplicacion
El codigo que aparece a continuacion implementa en Java la aplicacion que muestraen la terminal la frase ldquoHola Mundo en Javardquo
1
2 Applicacion Simple3
4 class AplicacionSimple
5 public static void main(String[] args)
6 Systemoutprintln(Hola Mundo en Java)
7
8
El primer paso para manipular una aplicacion Java es compilarla ejecutando en la lıneade comandos la instruccion
gtjavac AplicacionSimplejava
Es importante que el nombre del fichero que contiene el c odigo coincida exactamentecon el nombre de la clase que aparece en la lınea numero 3
Al realizar este paso se obtiene un fichero AplicacionSimpleclass Para ejecutar la aplicacion escribimos en la lınea de comandos
gtjava AplicacionSimple
y obtenemos el resultado que aparece en la figura 21
15
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1849
Herramientas y Lenguajes de Programacion 06-07 16
Figura 21 Ejecucion de la aplicacion
22 Ejercicios
1 Compile y ejecute el ejemplo de aplicacion
2 Escriba una aplicacion Java que
Contemple la creacion de una clase (Clase1) que contengan un atributo enteroy metodos para establecer y recuperar los valores de dicho atributo
Definir una segunda clase (Clase2) con un atributo que es un objeto de la
Clase1 y con un metodo que establece diez valores diferentes en el atributo dela Clase1
Definir una tercera clase (Clase3) con un atributo que es un objeto de la Clase1
y con un metodo que recupera diez valores del atributo de la Clase1
Finalmente crear una clase de prueba donde se instancien objetos de las clasesanteriores y se invoque a sus metodos
3 Escriba la jerarquıa de clases del programa que ha desarrollado
4 Dibuje una traza del flujo de ejecucion de la aplicacion
5 Comente sus clases utilizando javadoc genere ficheros de descripcion de su clase
similares a los de la documentacion de las API de Java
En el documento de descripcion de la herramienta Javadoc puede encontrar la formade uso de las distintas etiquetas disponibles
see author version param return
(conexion a javasuncom )
Ejecute el comando javadoc desde la lınea de comandos sin ningun argumento yobtendra una lista de las opciones con las que puede llamar a la herramienta
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1949
Herramientas y Lenguajes de Programacion 06-07 17
Notese que para que aparezcan en el fichero html los comentarios asociados a los
campos de datos privados tiene que compilarlos con la opcion -privateDe la misma forma para que aparezcan el autor y la versi on se han de utilizar lasopciones -author y -version
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2049
Capıtulo 3
Programas Java applets
El objetivo de esta practica es mostrar el modo de funcionamiento de los distintos tiposde programas Java En esta practica se abordaran los applets
31 Ejemplo de applet
El codigo que aparece a continuacion muestra la implementacion en Java del programaque muestra en la ventana principal del navegador la frase ldquoHola Mundo en Javardquo
Applet Sencillo
import javaappletApplet
import javaawtGraphics
public class AppletSimple extends Applet
public void paint(Graphics g)
gdrawString(Hola Mundo en Java 50 25)
El primer paso para manipular un applet Java es compilarlo ejecutando en la lınea decomandos la instruccion
gtjavac AppletSimplejava
Al realizar este paso se obtiene una fichero AppletSimpleclassEl fichero class resultante de la compilacion se ha de incrustar en un fichero para
ser ejecutado por un navegadorEn este caso las etiquetas a utilizar son ltAPPLETgt y ltAPPLETgt
18
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1549
Herramientas y Lenguajes de Programacion 06-07 13
programa Ası que el desarrollo se organiza en torno a los datos y no a como se debefuncionar
En la programacion orientada a objetos un programa es una coleccion de una solaentidad basica el objeto el cual combina los datos con los procedimientos que actuan
sobre ellos Durante la ejecucion los ob jetos reciben y envıan mensajes a otros objetospara ejecutar las acciones requeridas
La programacion orientada a objetos se puede llevar a cabo con lenguajes convenciona-les pero esto exige al programador la construccion de los mecanismos de que disponen loslenguajes orientados a objetos tales como objetos clases metodos mensajes herenciaetc
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1649
Herramientas y Lenguajes de Programacion 06-07 14
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1749
Capıtulo 2
Programas Java Aplicaciones
El objetivo de este ejercicio practico es mostrar el modo de funcionamiento de losdistintos tipos de programas Java En este caso se abordar an las aplicaciones
21 Ejemplo de aplicacion
El codigo que aparece a continuacion implementa en Java la aplicacion que muestraen la terminal la frase ldquoHola Mundo en Javardquo
1
2 Applicacion Simple3
4 class AplicacionSimple
5 public static void main(String[] args)
6 Systemoutprintln(Hola Mundo en Java)
7
8
El primer paso para manipular una aplicacion Java es compilarla ejecutando en la lıneade comandos la instruccion
gtjavac AplicacionSimplejava
Es importante que el nombre del fichero que contiene el c odigo coincida exactamentecon el nombre de la clase que aparece en la lınea numero 3
Al realizar este paso se obtiene un fichero AplicacionSimpleclass Para ejecutar la aplicacion escribimos en la lınea de comandos
gtjava AplicacionSimple
y obtenemos el resultado que aparece en la figura 21
15
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1849
Herramientas y Lenguajes de Programacion 06-07 16
Figura 21 Ejecucion de la aplicacion
22 Ejercicios
1 Compile y ejecute el ejemplo de aplicacion
2 Escriba una aplicacion Java que
Contemple la creacion de una clase (Clase1) que contengan un atributo enteroy metodos para establecer y recuperar los valores de dicho atributo
Definir una segunda clase (Clase2) con un atributo que es un objeto de la
Clase1 y con un metodo que establece diez valores diferentes en el atributo dela Clase1
Definir una tercera clase (Clase3) con un atributo que es un objeto de la Clase1
y con un metodo que recupera diez valores del atributo de la Clase1
Finalmente crear una clase de prueba donde se instancien objetos de las clasesanteriores y se invoque a sus metodos
3 Escriba la jerarquıa de clases del programa que ha desarrollado
4 Dibuje una traza del flujo de ejecucion de la aplicacion
5 Comente sus clases utilizando javadoc genere ficheros de descripcion de su clase
similares a los de la documentacion de las API de Java
En el documento de descripcion de la herramienta Javadoc puede encontrar la formade uso de las distintas etiquetas disponibles
see author version param return
(conexion a javasuncom )
Ejecute el comando javadoc desde la lınea de comandos sin ningun argumento yobtendra una lista de las opciones con las que puede llamar a la herramienta
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1949
Herramientas y Lenguajes de Programacion 06-07 17
Notese que para que aparezcan en el fichero html los comentarios asociados a los
campos de datos privados tiene que compilarlos con la opcion -privateDe la misma forma para que aparezcan el autor y la versi on se han de utilizar lasopciones -author y -version
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2049
Capıtulo 3
Programas Java applets
El objetivo de esta practica es mostrar el modo de funcionamiento de los distintos tiposde programas Java En esta practica se abordaran los applets
31 Ejemplo de applet
El codigo que aparece a continuacion muestra la implementacion en Java del programaque muestra en la ventana principal del navegador la frase ldquoHola Mundo en Javardquo
Applet Sencillo
import javaappletApplet
import javaawtGraphics
public class AppletSimple extends Applet
public void paint(Graphics g)
gdrawString(Hola Mundo en Java 50 25)
El primer paso para manipular un applet Java es compilarlo ejecutando en la lınea decomandos la instruccion
gtjavac AppletSimplejava
Al realizar este paso se obtiene una fichero AppletSimpleclassEl fichero class resultante de la compilacion se ha de incrustar en un fichero para
ser ejecutado por un navegadorEn este caso las etiquetas a utilizar son ltAPPLETgt y ltAPPLETgt
18
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1649
Herramientas y Lenguajes de Programacion 06-07 14
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1749
Capıtulo 2
Programas Java Aplicaciones
El objetivo de este ejercicio practico es mostrar el modo de funcionamiento de losdistintos tipos de programas Java En este caso se abordar an las aplicaciones
21 Ejemplo de aplicacion
El codigo que aparece a continuacion implementa en Java la aplicacion que muestraen la terminal la frase ldquoHola Mundo en Javardquo
1
2 Applicacion Simple3
4 class AplicacionSimple
5 public static void main(String[] args)
6 Systemoutprintln(Hola Mundo en Java)
7
8
El primer paso para manipular una aplicacion Java es compilarla ejecutando en la lıneade comandos la instruccion
gtjavac AplicacionSimplejava
Es importante que el nombre del fichero que contiene el c odigo coincida exactamentecon el nombre de la clase que aparece en la lınea numero 3
Al realizar este paso se obtiene un fichero AplicacionSimpleclass Para ejecutar la aplicacion escribimos en la lınea de comandos
gtjava AplicacionSimple
y obtenemos el resultado que aparece en la figura 21
15
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1849
Herramientas y Lenguajes de Programacion 06-07 16
Figura 21 Ejecucion de la aplicacion
22 Ejercicios
1 Compile y ejecute el ejemplo de aplicacion
2 Escriba una aplicacion Java que
Contemple la creacion de una clase (Clase1) que contengan un atributo enteroy metodos para establecer y recuperar los valores de dicho atributo
Definir una segunda clase (Clase2) con un atributo que es un objeto de la
Clase1 y con un metodo que establece diez valores diferentes en el atributo dela Clase1
Definir una tercera clase (Clase3) con un atributo que es un objeto de la Clase1
y con un metodo que recupera diez valores del atributo de la Clase1
Finalmente crear una clase de prueba donde se instancien objetos de las clasesanteriores y se invoque a sus metodos
3 Escriba la jerarquıa de clases del programa que ha desarrollado
4 Dibuje una traza del flujo de ejecucion de la aplicacion
5 Comente sus clases utilizando javadoc genere ficheros de descripcion de su clase
similares a los de la documentacion de las API de Java
En el documento de descripcion de la herramienta Javadoc puede encontrar la formade uso de las distintas etiquetas disponibles
see author version param return
(conexion a javasuncom )
Ejecute el comando javadoc desde la lınea de comandos sin ningun argumento yobtendra una lista de las opciones con las que puede llamar a la herramienta
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1949
Herramientas y Lenguajes de Programacion 06-07 17
Notese que para que aparezcan en el fichero html los comentarios asociados a los
campos de datos privados tiene que compilarlos con la opcion -privateDe la misma forma para que aparezcan el autor y la versi on se han de utilizar lasopciones -author y -version
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2049
Capıtulo 3
Programas Java applets
El objetivo de esta practica es mostrar el modo de funcionamiento de los distintos tiposde programas Java En esta practica se abordaran los applets
31 Ejemplo de applet
El codigo que aparece a continuacion muestra la implementacion en Java del programaque muestra en la ventana principal del navegador la frase ldquoHola Mundo en Javardquo
Applet Sencillo
import javaappletApplet
import javaawtGraphics
public class AppletSimple extends Applet
public void paint(Graphics g)
gdrawString(Hola Mundo en Java 50 25)
El primer paso para manipular un applet Java es compilarlo ejecutando en la lınea decomandos la instruccion
gtjavac AppletSimplejava
Al realizar este paso se obtiene una fichero AppletSimpleclassEl fichero class resultante de la compilacion se ha de incrustar en un fichero para
ser ejecutado por un navegadorEn este caso las etiquetas a utilizar son ltAPPLETgt y ltAPPLETgt
18
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1749
Capıtulo 2
Programas Java Aplicaciones
El objetivo de este ejercicio practico es mostrar el modo de funcionamiento de losdistintos tipos de programas Java En este caso se abordar an las aplicaciones
21 Ejemplo de aplicacion
El codigo que aparece a continuacion implementa en Java la aplicacion que muestraen la terminal la frase ldquoHola Mundo en Javardquo
1
2 Applicacion Simple3
4 class AplicacionSimple
5 public static void main(String[] args)
6 Systemoutprintln(Hola Mundo en Java)
7
8
El primer paso para manipular una aplicacion Java es compilarla ejecutando en la lıneade comandos la instruccion
gtjavac AplicacionSimplejava
Es importante que el nombre del fichero que contiene el c odigo coincida exactamentecon el nombre de la clase que aparece en la lınea numero 3
Al realizar este paso se obtiene un fichero AplicacionSimpleclass Para ejecutar la aplicacion escribimos en la lınea de comandos
gtjava AplicacionSimple
y obtenemos el resultado que aparece en la figura 21
15
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1849
Herramientas y Lenguajes de Programacion 06-07 16
Figura 21 Ejecucion de la aplicacion
22 Ejercicios
1 Compile y ejecute el ejemplo de aplicacion
2 Escriba una aplicacion Java que
Contemple la creacion de una clase (Clase1) que contengan un atributo enteroy metodos para establecer y recuperar los valores de dicho atributo
Definir una segunda clase (Clase2) con un atributo que es un objeto de la
Clase1 y con un metodo que establece diez valores diferentes en el atributo dela Clase1
Definir una tercera clase (Clase3) con un atributo que es un objeto de la Clase1
y con un metodo que recupera diez valores del atributo de la Clase1
Finalmente crear una clase de prueba donde se instancien objetos de las clasesanteriores y se invoque a sus metodos
3 Escriba la jerarquıa de clases del programa que ha desarrollado
4 Dibuje una traza del flujo de ejecucion de la aplicacion
5 Comente sus clases utilizando javadoc genere ficheros de descripcion de su clase
similares a los de la documentacion de las API de Java
En el documento de descripcion de la herramienta Javadoc puede encontrar la formade uso de las distintas etiquetas disponibles
see author version param return
(conexion a javasuncom )
Ejecute el comando javadoc desde la lınea de comandos sin ningun argumento yobtendra una lista de las opciones con las que puede llamar a la herramienta
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1949
Herramientas y Lenguajes de Programacion 06-07 17
Notese que para que aparezcan en el fichero html los comentarios asociados a los
campos de datos privados tiene que compilarlos con la opcion -privateDe la misma forma para que aparezcan el autor y la versi on se han de utilizar lasopciones -author y -version
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2049
Capıtulo 3
Programas Java applets
El objetivo de esta practica es mostrar el modo de funcionamiento de los distintos tiposde programas Java En esta practica se abordaran los applets
31 Ejemplo de applet
El codigo que aparece a continuacion muestra la implementacion en Java del programaque muestra en la ventana principal del navegador la frase ldquoHola Mundo en Javardquo
Applet Sencillo
import javaappletApplet
import javaawtGraphics
public class AppletSimple extends Applet
public void paint(Graphics g)
gdrawString(Hola Mundo en Java 50 25)
El primer paso para manipular un applet Java es compilarlo ejecutando en la lınea decomandos la instruccion
gtjavac AppletSimplejava
Al realizar este paso se obtiene una fichero AppletSimpleclassEl fichero class resultante de la compilacion se ha de incrustar en un fichero para
ser ejecutado por un navegadorEn este caso las etiquetas a utilizar son ltAPPLETgt y ltAPPLETgt
18
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1849
Herramientas y Lenguajes de Programacion 06-07 16
Figura 21 Ejecucion de la aplicacion
22 Ejercicios
1 Compile y ejecute el ejemplo de aplicacion
2 Escriba una aplicacion Java que
Contemple la creacion de una clase (Clase1) que contengan un atributo enteroy metodos para establecer y recuperar los valores de dicho atributo
Definir una segunda clase (Clase2) con un atributo que es un objeto de la
Clase1 y con un metodo que establece diez valores diferentes en el atributo dela Clase1
Definir una tercera clase (Clase3) con un atributo que es un objeto de la Clase1
y con un metodo que recupera diez valores del atributo de la Clase1
Finalmente crear una clase de prueba donde se instancien objetos de las clasesanteriores y se invoque a sus metodos
3 Escriba la jerarquıa de clases del programa que ha desarrollado
4 Dibuje una traza del flujo de ejecucion de la aplicacion
5 Comente sus clases utilizando javadoc genere ficheros de descripcion de su clase
similares a los de la documentacion de las API de Java
En el documento de descripcion de la herramienta Javadoc puede encontrar la formade uso de las distintas etiquetas disponibles
see author version param return
(conexion a javasuncom )
Ejecute el comando javadoc desde la lınea de comandos sin ningun argumento yobtendra una lista de las opciones con las que puede llamar a la herramienta
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1949
Herramientas y Lenguajes de Programacion 06-07 17
Notese que para que aparezcan en el fichero html los comentarios asociados a los
campos de datos privados tiene que compilarlos con la opcion -privateDe la misma forma para que aparezcan el autor y la versi on se han de utilizar lasopciones -author y -version
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2049
Capıtulo 3
Programas Java applets
El objetivo de esta practica es mostrar el modo de funcionamiento de los distintos tiposde programas Java En esta practica se abordaran los applets
31 Ejemplo de applet
El codigo que aparece a continuacion muestra la implementacion en Java del programaque muestra en la ventana principal del navegador la frase ldquoHola Mundo en Javardquo
Applet Sencillo
import javaappletApplet
import javaawtGraphics
public class AppletSimple extends Applet
public void paint(Graphics g)
gdrawString(Hola Mundo en Java 50 25)
El primer paso para manipular un applet Java es compilarlo ejecutando en la lınea decomandos la instruccion
gtjavac AppletSimplejava
Al realizar este paso se obtiene una fichero AppletSimpleclassEl fichero class resultante de la compilacion se ha de incrustar en un fichero para
ser ejecutado por un navegadorEn este caso las etiquetas a utilizar son ltAPPLETgt y ltAPPLETgt
18
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 1949
Herramientas y Lenguajes de Programacion 06-07 17
Notese que para que aparezcan en el fichero html los comentarios asociados a los
campos de datos privados tiene que compilarlos con la opcion -privateDe la misma forma para que aparezcan el autor y la versi on se han de utilizar lasopciones -author y -version
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2049
Capıtulo 3
Programas Java applets
El objetivo de esta practica es mostrar el modo de funcionamiento de los distintos tiposde programas Java En esta practica se abordaran los applets
31 Ejemplo de applet
El codigo que aparece a continuacion muestra la implementacion en Java del programaque muestra en la ventana principal del navegador la frase ldquoHola Mundo en Javardquo
Applet Sencillo
import javaappletApplet
import javaawtGraphics
public class AppletSimple extends Applet
public void paint(Graphics g)
gdrawString(Hola Mundo en Java 50 25)
El primer paso para manipular un applet Java es compilarlo ejecutando en la lınea decomandos la instruccion
gtjavac AppletSimplejava
Al realizar este paso se obtiene una fichero AppletSimpleclassEl fichero class resultante de la compilacion se ha de incrustar en un fichero para
ser ejecutado por un navegadorEn este caso las etiquetas a utilizar son ltAPPLETgt y ltAPPLETgt
18
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2049
Capıtulo 3
Programas Java applets
El objetivo de esta practica es mostrar el modo de funcionamiento de los distintos tiposde programas Java En esta practica se abordaran los applets
31 Ejemplo de applet
El codigo que aparece a continuacion muestra la implementacion en Java del programaque muestra en la ventana principal del navegador la frase ldquoHola Mundo en Javardquo
Applet Sencillo
import javaappletApplet
import javaawtGraphics
public class AppletSimple extends Applet
public void paint(Graphics g)
gdrawString(Hola Mundo en Java 50 25)
El primer paso para manipular un applet Java es compilarlo ejecutando en la lınea decomandos la instruccion
gtjavac AppletSimplejava
Al realizar este paso se obtiene una fichero AppletSimpleclassEl fichero class resultante de la compilacion se ha de incrustar en un fichero para
ser ejecutado por un navegadorEn este caso las etiquetas a utilizar son ltAPPLETgt y ltAPPLETgt
18
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2149
Herramientas y Lenguajes de Programacion 06-07 19
El siguiente codigo html contine la estructura de la etiqueta para el ejemplo que nos
ocupa (esta almacenado en un fichero con nombre htmlhtml)
lthtmlgt
ltheadgt
lttitlegt Un applet simple lttitlegt
ltheadgt
ltbodygt
ltpgt
A continuacion esta la salida del programa
ltpgt
ltapplet code=AppletSimpleclass width=300 height=100gt
No hay disponible un interprete de Java
ltappletgt
ltbodygt
lthtmlgt
Notese que en el atributo asociado code de la etiqueta ltAPPLETgt se ha especificadoAppletSimpleclass y no AppletSimplejava
Figura 31 Ejecucion del applet en un navegador
Finalmente cuando se abre con un navegador el fichero htmlhtml se obtiene el resul-tado que se muestra en la figura 31
El paquete de desarrollo que proporciona SUN tambien ofrece una herramienta devisualizacion Para usarla se ha de ejecutar
gtappletviewer htmlhtml
La herramienta appletviewer solo muestra el applet Ignora el codigo html en el queesta incrustado (vease la figura 32)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2249
Herramientas y Lenguajes de Programacion 06-07 20
Figura 32 Ejecucion del applet con appletviewer
32 Ejercicios
1 Compile y ejecute el ejemplo de applet
2 Implemente un applet que
Defina la misma jerarquıa de clases que en la practica anterior pero en la que laClase1 se denomine CampoTextoEntero y extienda a la clase javaawtTextFieldproporcionando metodos para establecer y recuperar un valor entero en un cam-po de texto
Cree una clase de prueba que extienda a la clase javaawtApplet donde seinstancien objetos de las clases definidas por usted y un objeto de la clasejavaawtButton Para anadir las componentes al applet utilizar el metodoadd en el la implementacion del metodo init del applet
Implemente los eventos de manera que cuando el usuario pulse el boton se invo-quen a los metodos que permiten establecer y recuperar los diez valores del cam-po de texto Para ello la clase debe implementar la interfaz ActionListener
que solo incluye al metodo public void actionPerformed(ActionEvent e)Para registrar al applet como oyente del objeto boton utilizar el metodo
addActionListner
3 Escriba la jerarquıa de clases del applet que ha desarrollado
4 Dibuje una traza del flujo de ejecucion del applet
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2349
Capıtulo 4
Creacion de Threads
El objetivo de esta practica es introducir al uso de los threads (hilos) y trabajar conlas clases que permiten su creacion
41 La clase Thread
Para crear y ejecutar un thread en primer lugar hay que definir una clase que extiendaa la clase Thread Esta clase debe sobreescribir el metodo run() que le dice al sistema latarea que debe ejecutar el thread
class AClass extends Thread
public void run()
En una clase cliente se crea un objeto thread A estos objetos se les denomina ldquoobjetosejecutablesrdquo El metodo start() le indica al sistema que el thread esta listo para ejecutarse
public class Client
public static void main(String [] args)
AClass ut = new AClass()
utstart()
21
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2449
Herramientas y Lenguajes de Programacion 06-07 22
42 La interfaz Runnable
Para crear un thread para una clase que hereda de otra es necesario implementar lainterfaz Runnable Para ello podemos seguir los siguientes pasos generales
Anadir en la declaracion de la clase que se va a implementar la interfaz Runnable
public class AClass extends MotherClass implements Runnable
Declarar un objeto Thread en la clase destino Por ejemplo las siguientes sentenciasdeclaran una instancia de la clase Thread t con valor inicial nulo
private Thread t = null
Por defecto el valor inicial es nulo ası que la asignacion al valor ldquonullrdquono es necesaria
Crear un thread (con el operador new) y ponerla en marcha llamando a su metodostart()
t = new Thread(this) crear el thread
tstart() poner en marcha el thread
El argumento ldquothisen el constructor del thread es indispensable puesto que especificaque el metodo run() de la clase actual es el que se debe llamar cuando se ejecute elthread
El metodo start() del thread provoca que el metodo run() se ejecute
Implementar en el metodo run() de la clase la tarea que se quiere que ejecute elthread
43 Ejercicios1 Escriba una aplicacion Java que implemente lo siguiente
Contemple la creacion de una clase (Mostrador) que contengan un atributoentero y metodos para establecer y recuperar los valores de dicho atributo
Escriba una aplicacion ProductorConsumidor en la que se instancian dos ob- jetos uno de tipo Productor y otro de tipo Consumidor
Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2549
Herramientas y Lenguajes de Programacion 06-07 23
Productor Consumidor
Mostrador
Figura 41 Ejemplo del ProductorConsumidor
El Productor genera un entero entre 0 y 1000 lo almacena en el mostrador ylo imprime
El Consumidor al contrario consume el entero del mostrador que es exacta-mente el mismo objeto en el que el Productor coloca los enteros
Ası pues el productor y el consumidor de este ejemplo comparten los datos atraves del objeto de tipo Mostrador (figura 83)
2 Dibuje la jerarquıa de clases que ha implementado
3 Dibuje el diagrama de ejecucion de la aplicacion (tiempo times metodo)
4 Escriba un applet que implemente lo mismo que el ejercicio 1
5 Dibuje la jerarquıa de clases para el applet
6 Dibuje el diagrama de ejecucion del applet (tiempo times metodo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2649
Capıtulo 5
Sincronizacion de Threads
El objetivo de esta practica es trabajar con los principios basicos de los threads (hilos)la sincronizacion y la secuencializacion
51 Exclusion mutua y secuencializacion
La programacion se vuelve un poco mas compleja cuando se tiene un programa conthreads Considerese la siguiente descripcion aparentemente sencilla
Los threads A y B comparten un dato contador El thread A efectua repeti-damente algunos calculos que producen un entero y lo coloca en el contadorEl thread B obtiene repetidamente el texto del contador y lo utiliza para suspropios calculos
Cuando el programa este en ejecucion el sistema alterna la ejecucion de A y B Laforma en que ocurre esto varıa de un Sistema Operativo a otro y esta completamente fueradel control del programador
Es posible que el sistema ejecute un thread hasta terminarlo antes de iniciar el otroque ejecute tres instrucciones de un thread antes de hacer lo mismo con una del otro eincluso que deje un thread en medio de una instruccion lo suspenda y empiece con el otro
Una vez adevertido que es imposible suponer nada acerca del orden de ejecucion
de dos o mas threads aparecen los siguientes escenarios
1 El thread A se ejecuta parcialmente en la actualizacion del contador y luego la ejecu-cion cambia a B El resultado de B puede recibir basura cuando trata de inspeccionarel contador
2 El thread A escribe nueva informacion en el contador antes de que B inspeccione elvalor antiguo Este ultimo se pierde
3 El thread B recibe un valor y luego accede a contador de nuevo antes de que A hayagenerado un nuevo valor Se utiliza dos veces el valor antiguo
24
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2749
Herramientas y Lenguajes de Programacion 06-07 25
El escenario 1 requiere exclusion mutua en que no permite que dos threads tengan
acceso simultaneo al recurso compartido contador Los escenarios 2 y 3 requieren secuen-cializacion en que cada thread debe esperar a que el otro termine de usar el recursocompartido
Es importante senalar que estos escenarios son problematicos solo porque los threads Ay B tienen acceso al objeto contador Si el codigo que ejecutan A y B no hiciera referenciaa un objeto compartido estos subprocesos podrıan ejecutarse en el orden que decida elSistema Operativo y dicho orden no tendrıa efecto en el resultado del programa
La aplicacion PCTestjava contiene la definicion de una aplicacion ProductorCon-sumidor en la que se instancian dos objetos uno de tipo Productor y otro de tipoConsumidor Estos objetos son threads que se encargan uno de poner un valor y el otro derecogerlo de un objeto de tipo Mostrador El Productor genera enteros entre 0 y 9 los
almacena en el mostrador y los imprime El Consumidor al contrario consume todos losenteros del mostrador (que es exactamente el mismo objeto en el que el productor colocalos enteros) tan pronto como estan disponibles Ası pues el productor y el consumidor deeste ejemplo comparten los datos a traves del objeto de tipo Mostrador
52 Ejercicios
1 Compile y ejecute la aplicacion ProductorConsumidor
2 Anada al codigo de la aplicacion ProductorConsumidor las sentencias necesariaspara que los dos threads que se ejecutan pasen al estado de dormido durante un
intervalo aleatorio de tiempo iquestCambia el resultado de la ejecuci on iquestPor que
3 Implemente los cambios necesarios para que el programa admita la creacion de masde un thread productor y mas de un thread consumidor Ejecute el nuevo progra-ma lanzando varios productores y varios consumidores Dibuje el diagrama de laejecucion (metodos times tiempo)
4 Anada los cambios necesarios al applet que se ha desarrollado en practicas anteriorespara que tenga el mismo funcionamiento que la aplicacion ProductorConsumidor Ademas
El Productor generara los enteros impares sucesivos y los colocara en el campo
de texto compartidoEl Consumidor ha de recoger los valores del campo de texto y sumarlos
El Productor indica el final de su tarea colocando el valor ldquo-1rdquo en el campo detexto mientras que el Consumidor utiliza el ldquo-1rdquo como senal para informar dela suma
Finalmente cuando el usuario hace click en el bot on del applet se lanzan losthreads
Dibuje el diagrama de la ejecucion (metodos times tiempo)
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2849
Capıtulo 6
Direcciones IP y Nombres de
Dominio
El objetivo de esta practica es mostrar el modo de funcionamiento de las clase Javapara definir nombres de recursos en Internet
61 La clase InetAddress
La clase InetAddress proporciona objetos que se pueden utilizar para manipular tantodirecciones IP como nombres de dominio
Ejemplo
El ejemplo TestInetAddressjava trata de ilustrar la utilizacion de varios de los meto-dos de la clase InetAddress Para que el programa se ejecute correctamente y no aparezcauna excepcion del tipo ldquoUnknownHostExceptionrdquo hay que estar conectados conveniente-mente En caso de conectarse a un proveedor de Internet la asignacion de direcciones esautomatica por parte del ISP (Internet Service Provider ) con lo cual se va a obtener unadireccion diferente en cada conexion
import javanet
class TestInetAddress public static void main( String[] args )
try
Systemoutprintln( -gt Direccion IP de una URL por nombre )
InetAddress address = InetAddressgetByName( nereidadeioculles )
Systemoutprintln( address )
Extrae la direccion IP a partir de la cadena que se
encuentra a la derecha de la barra luego proporciona
esta direccion IP como argumento de llamada al metodo getByName()
Systemoutprintln( -gt Nombre a partir de la direccion )
26
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 2949
Herramientas y Lenguajes de Programacion 06-07 27
int temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )Systemoutprintln( address )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
address = InetAddressgetLocalHost()
Systemoutprintln( address )
Systemoutprintln( -gt Nombre de LocalHost a partir de la direccion )
temp = addresstoString()indexOf( rsquorsquo )
address = InetAddressgetByName( addresstoString()substring(temp+1) )
Systemoutprintln( address )
Systemoutprintln( -gt Nombre actual de LocalHost )
Systemoutprintln( addressgetHostName() )
Systemoutprintln( -gt Direccion IP actual de LocalHost )
Coge la direccion IP como un array de bytes
byte[] bytes = addressgetAddress()
Convierte los bytes de la direccion IP a valores sin
signo y los presenta separados por espacios
for( int cnt=0 cnt lt byteslength cnt++ )
int uByte = bytes[cnt] lt 0 bytes[cnt]+256 bytes[cnt]
Systemoutprint( uByte+ )
Systemoutprintln()
catch( UnknownHostException e )
Systemoutprintln( e )Systemoutprintln( Debes estar conectado para que esto funcione bien )
62 Ejercicios
1 Compile y ejecute el ejemplo TestInetAddress
2 Existe un gran numero de nombres de dominio y direcciones IP en Internet por lo
que es deseable un servicio que permita asociar un nombre con la direccion corres-pondiente Dicho servicio se conoce con el nombre de DNS (Servicio de Nombres deDominio - Domain Name Service) Un ejemplo de este servicio es la utilidad UNIXnslookup Utilizando nslookup se puede encontrar el nombre de dominio de unadireccion IP o viceversa la direccion IP de un nombre de dominio Haciendo usode la clase InetAddress escriba un programa Java Nslookupjava que muestre ladireccion IP de una maquina dado su nombre
Usage java Nslookup lthostnamegt
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3049
Herramientas y Lenguajes de Programacion 06-07 28
3 Escriba un programa Java IPtonamejava que dada la direccion IP de una maquina
muestre su nombre
Usage java IPtoname ltIP addressgt
4 iquestCual es la IP de la direccion de red asignada a la Universidad de La LagunaiquestQue clase de red es (A hasta E)
5 iquestCual es el nombre de dominio del servidor web de la Universidad de La LagunaiquestCual es su direccion IP
6 Utilice los programas que ha implementado para completar la siguiente tabla
Direccion IP Nombre de Dominio
127001
19314598254
cepbaupces
2240124
wwwmitedu
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3149
Capıtulo 7
Las clases Java DatagramPacket y
DatagramSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir datagramas y sockets de datagrama
71 Introduccion
Las redes actuales utilizan el packet switching para la transferencia de datos Los datosse envuelven en paquetes que se transfieren desde un origen a un destino donde se extraen
de uno en uno los datos de uno o mas paquetes para reconstruir el mensaje originalLos nodos que se comunican a traves de Internet utilizan principalmente dos protocolos
tcp - Transsmision Control Protocol
udp - (Universal | User) Datagram Protocol
El protocolo udp - (User | Universal) Datagram Protocol - se utiliza para comunica-ciones en la que no se garantiza una transmision fiable (reliable) udp no esta orientado aconexion por lo tanto no garantiza la entrega udp envıa paquetes de datos independientesdenominados datagramas desde una aplicacion a otra
El envıo de datagramas es similar a enviar una carta a traves del servicio postal El
orden de salida no es importante y no esta garantizado y cada mensaje es independientede cualquier otro
En las comunicaciones basadas en datagramas como las udp el paquete de datagramascontiene el numero de puerto de su destino y udp encamina el paquete a la aplicacionapropiada como ilustra la figura 83
El API Java para udp proporciona una abstracion del ldquopaso de mensajesrdquo esto esla forma mas simple de comunicacion entre ordenadores Esto hace posible a un procesoemisor transmitir un unico mensaje a un proceso receptor Los paquetes independientesque contienen esos mensajes se denominan datagramas En Java el emisor especifica el
29
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3249
Herramientas y Lenguajes de Programacion 06-07 30
Figura 71
destino usando un socket (una referencia indirecta a un puerto particular usada por elproceso receptor en la maquina receptora)
Un datagrama enviado mediante udp es trasmitido desde un proceso emisor a unproceso receptor sin reconocimiento o recomprobaciones Si tiene lugar un fallo el mensajepuede no llegar Un datagrama es transmitido entre procesos cuando un proceso lo envıay otro proceso lo recibe Cualquier proceso que necesite enviar o recibir mensajes debe enprimer lugar crear un socket a un direccion de Internet y a un puerto local Un servidorenlazara ese socket a un puerto servidor - uno que se hace conocido a los clientes de maneraque puedan enviar mensajes al mismo Un cliente enlaza su socket a cualquier puerto locallibre El metodo receptor devuelve la direccion de Internet y el puerto del emisor ademasdel mensaje permitiendo a los receptores enviar una respuesta
Las clases Java para establecer comunicaciones mediante datagramas son Datagram-Packet y DatagramSocket
72 La clase DatagramPacket
La clase DatagramPacket proporciona un constructor que permite crear instancias deun array de bytes parar el mensaje la longitud del mensaje la direcci on Internet y elpuerto local del socket de destino de la siguiente forma
array de bytes que contiene el mensaje longitud del mensaje direccio n Int en et numero de puerto
Los objetos del tipo DatagramPacket se pueden transmitir entre procesos cuando unproceso los envıa y otro los recibe
Esta clase proporciona otro constructor para usarlo cuando se recibe un mensaje Susargumentos especifican un array de bytes en el que recibir el mensaje y la longitud delarray Cuando se recibe un mensaje se pone en el DatagramPacket junto con su longitudla direccion de Internet y el puerto del socket de envıo
Se puede obtener el mensaje del objeto DatagramPacket mediante el metodo getData()Los metodos getPort() y getAddress() permiten obtener el puerto y la direccion Internetdel objeto de tipo DatagramPacket
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3349
Herramientas y Lenguajes de Programacion 06-07 31
El proceso receptor del mensaje tiene que especificar un array de bytes de un tamano
determinado en el cual recibir el mensaje esto es ha de predecir el Tama˜ no del Mensaje Siel mensaje es muy grande para el array se trunca cuando llega El protocolo ip subyacentepermite longitudes de paquetes de mas de 216 bytes que incluye tanto las cabeceras comolos mensajes Sin embargo la mayorıa de los entornos imponen una restriccion en el tamanoa 8 kilobytes Cualquier aplicacion que necesite mensajes mayores que el maximo debefragmentarlos en pedazos de ese tamano Generalmente una aplicacion decidira sobre untamano que no sea excesivamente grande pero que se adecue a su uso previsto
73 La clase DatagramSocket
La clase DatagramSocket da soporte a sockets para el envıo y recepcion de datagramasudp
Se proporciona un constructor que toma un puerto como argumento para que seausado por los procesos que necesitan usar un puerto particular Tambien se proporcionaun constructor sin argumentos que permite al sistema escoger un puerto local libre Estosconstructores pueden lanzar una excepcion del tipo SocketException si el puerto yaesta en uso o si esta reservado
Esta clase cuenta con los siguientes metodos
send() y receive()
Estos metodos permiten transmitir datagramas entre un par de sockets El argu-
mento del send es una instancia de un DatagramPacket que contiene un mensajey su destino El argumento del receive es un objeto DatagramPacket vacıo en elcual se pondra el mensa je su longitud y su origen Tanto el metodo send() como elreceive() pueden lanzar una IOException
Las comunicaciones mediante datagramas de udp usan envıos no bloqueantes (non-blocking sends) y recepciones bloqueantes (blocking receives) Las operaciones deenvıo retornan cuando estas han dado el mensaje a los protocolos ip o udp sub-yacentes los cuales son responsables de trasmitirlos a su destino En la llegada elmensaje es puesto en una cola por el socket que esta asociado al puerto de destinoEl mensaje puede ser recogido de la cola por una excepcion o llamadas futuras derecepcion (receive()) sobre ese socket Los mensajes son descartados en el des-
tino si ningun proceso tiene asociado un socket al puerto de destino El metodoreceptor (receive()) se bloquea hasta que se recibe un datagrama a menos quese establezca un tiempo lımite (timeout) sobre el socket Si el proceso que invocaal metodo receive() tiene otra tarea que hacer mientras espera por el mensajedeberıa planificarse en un flujo de ejecucion (thread ) separado
setSoTimeout()
Este metodo permite establecer un tiempo de espera Con un tiempo de esperaestablecido el metodo receive() se bloqueara por el tiempo especificado y entonceslanzara una InterruptedIOException()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3449
Herramientas y Lenguajes de Programacion 06-07 32
connect()
Este metodo se utiliza para conectar a un puerto remoto particular y una direccionde Internet en este caso el socket solo es capaz de enviar y recibir mensajes desdeesa direccion
74 Ejercicios
El siguiente codigo utiliza sockets datagrama para intercambiar una unica cadena dedatos La logica del programa es lo mas sencilla posible para subrayar la sintaxis basicade las comunicaciones entre procesos El emisor crea un paquete datagrama que contieneuna direccion de destino mientras que el paquete datagrama del receptor no incluye una
direccion de destino
import javanet
import javaio
public class Example1Sender
public static void main(String[] args)
if (argslength = 3)
Systemoutprintln (This program requires three command line arguments)
else
try
InetAddress receiverHost = InetAddressgetByName(args[0])
int receiverPort = IntegerparseInt(args[1])String message = args[2]
instantiates a datagram socket for sending the data
DatagramSocket mySocket = new DatagramSocket()
byte[ ] buffer = messagegetBytes( )
DatagramPacket datagram =
new DatagramPacket(buffer bufferlength
receiverHost receiverPort)
mySocketsend(datagram)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
El socket el emisor se enlaza a un numero de puerto no especificado mientras que elsocket del receptor se enlaza a un numero de puerto especıfico para que el emisor puedaescribir este numero de puerto en su datagrama como destino
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3549
Herramientas y Lenguajes de Programacion 06-07 33
import javanet
import javaio
public class Example1Receiver
public static void main(String[] args)
if (argslength = 1)
Systemoutprintln(This program requires a command line argument)
else
int port = IntegerparseInt(args[0])
final int MAX_LEN = 10
This is the assumed maximum byte length of the datagram to be received
try
DatagramSocket mySocket = new DatagramSocket(port)
instantiates a datagram socket for receiving the databyte[ ] buffer = new byte[MAX_LEN]
DatagramPacket datagram = new DatagramPacket(buffer MAX_LEN)
mySocketreceive(datagram)
String message = new String(buffer)
Systemoutprintln(message)
mySocketclose( )
end try
catch (Exception ex)
exprintStackTrace( )
end else
end main
end class
1 Compile y ejecute el codigo del ejemplo en una maquina usando ldquolocalhost rdquo comonombre de maquina Por ejemplo se puede introducir el comando
java Example1Sender localhost 12345 Hola
Ejecute los dos programas arrancando primero al receptor y despues al emisor Elmensaje que se envıe no deberıa exceder la longitud maxima permitida que es de 10caracteres
Describa el resultado de la ejecucion
2 Repita el ejercicio anterior utilizando las maquinas manisetsiiulles y timple-etsiiulles
3 Vuelva a ejecutar las aplicaciones del apartado 1 esta vez ejecutando primero alemisor y luego al receptor
Describa y explique el resultado
4 Repita el apartado 1 esta vez mandando un mensaje de longitud mas grande que lamaxima longitud permitida
Describa y explique la salida producida
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3649
Herramientas y Lenguajes de Programacion 06-07 34
5 Anada codigo al proceso receptor de manera que el plazo maximo de bloqueo del
receive sea de cinco segundos Lance el proceso receptor pero no el proceso emisoriquestCual es el resultado Descrıbalo y explıquelo
6 Modifique el codigo original de manera que el receptor ejecute indefinidamente unbucle que reciba y muestre los datos recibidos Compılelo y ejecutelo de la siguienteforma
lance al receptor
ejecute el emisor enviando un mensaje ldquomensaje 1rdquo
en otra ventana lanzar otra instancia del emisor mandando un mensaje ldquomen-saje 2rdquo
Describa y explique el resultado
7 Modifique el codigo original de manera que el emisor utilice el mismo socket paraenviar el mismo mensaje a dos receptores diferentes Primero lance los dos recepto-res y despues al emisor iquestCada receptor recibe el mensaje Describa y explique elresultado
8 Modifique el codigo original de manera que el emisor utilice dos socket distintospara enviar el mismo mensaje a dos receptores diferentes Primero lance los dosreceptores y despues al emisor iquestCada receptor recibe el mensaje Describa y expliqueel resultado
9 Modifique el codigo del ultimo paso de modo que el emisor envıe de forma perma-nente suspendiendose durante 3 segundos entre cada envıo
Modifique el receptor de manera que ejecute un bucle que repetidamente reciba datosy luego los muestre
Compile y ejecute los programas durante unos cuentos segundos antes de teminarloscon ldquoCtrl-Crdquo
Describa y explique el resultado
10 Modifique el codigo original de modo que el emisor tambien reciba un mensaje del
receptor Utilizar solo un socket en cada proceso Entregue este codigo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3749
Capıtulo 8
Las clases Java Socket y
ServerSocket
El objetivo de esta sesion practica es mostrar el modo de funcionamiento de las clasesJava para definir sockets de flujo (stream )
81 Introduccion
El paradigma ClienteServidor es quizas el mas conocido de los paradigmas para apli-caciones de red Se usa para describir un modelo de interaccion entre dos procesos que
se ejecutan de forma simultanea Este modelo es una comunicacion basada en una seriede preguntas y respuestas que asegura que si dos aplicaciones intentan comunicarse unacomienza la ejecucion y espera indefinidamente que la otra le responda y luego continuacon el proceso
Figura 81 Paradigma ClienteServidor
35
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3849
Herramientas y Lenguajes de Programacion 06-07 36
Los dos componentes del paradigma son
Cliente aplicacion que inicia la comunicacion es dirigida por el usuario
Servidor es quien responde a los requerimientos de los clientes son procesosque se estan ejecutando indefinidamente
Los procesos clientes son mas sencillos que los procesos de los servidores los primerosno requieren de privilegios de sistemas para funcionar en cambio los procesos servidoressı
Los usuarios cuando quieren acceder a un servicio de red ejecutan un software clienteEl diseno de los servidores debe ser muy cuidadoso debe incluir codigo para la manipula-
cion de
autenticaciacute on verificar la identidad del cliente
seguridad de datos para que estos no puedan ser accedidos inapropiadamente
privacidad garantizar que la informacion privada de un usuario no sea accedida poralguien no autorizado
protecciacute on asegurar que las aplicaciones no monopolicen los recursos del sistema
autorizaciacute on verificar si el cliente tiene acceso al servicio proporcionado por el ser-vidor
La mayorıa de las comunicaciones punto-a-punto en las redes (incluida Internet) estanbasadas en el modelo ClienteServidor Desde el punto de vista InternetIntranet setendrıa
Un servidor es un ordenador remoto ndash en algun lugar de la red ndash que proporcionainformacion segun peticion
Un cliente funciona en su ordenador local se comunica con el servidor remoto ypide a este informacion
El servidor envıa la informacion solicitada
Un unico servidor tıpicamente sirve a una multitud de clientes ahorrando a cada unode ellos el problema de tener la informacion instalada y almacenada localmente
82 Sockets
Normalmente un servidor se ejecuta en una maquina especıfica y tiene un socket aso-ciado a un numero de puerto especıfico El servidor simplemente espera a la escucha enel socket a que un cliente se conecte con una peticion El cliente conoce el nombre de la
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 3949
Herramientas y Lenguajes de Programacion 06-07 37
Figura 82 socket Servidor
macute aquina sobre la que esta ejecutandose el servidor y el nacute umero de puerto al que esta conec-tado Solicitar una conexion consiste en intentar establecer una cita con el servidor en elpuerto de la maquina servidora
Si todo va bien el servidor acepta la conexion Pero antes el servidor crea un nuevosocket en un puerto diferente Es necesario crear un nuevo socket (y consecuentemente unnumero de puerto diferente) de forma que en el socket original se continue a la escucha delas peticiones de nuevos clientes mientras se atiende a las necesidades del cliente conectadoEn el cliente si se acepta la conexion el socket se crea satisfactoriamente y se puede utilizarpara comunicarse con el servidor
Figura 83 socket Cliente
Un socket es el extremo final de un enlace punto-a-punto que comunica a dos programasejecutandose en una red
Los sockets siempre estan asociados a un numero de puerto que es utilizado por tcp
para identificar la aplicacion a la que esta destinada la solicitud y poder redirigirsela
821 La clase Socket
La clase Socket del paquete javanet es facil de usar comparada con la que propor-cinan otros lenguajes Java oculta las complejidades derivadas del establecimiento de laconexion de red y del envıo de datos a traves de ella En esencia el paquete javanet
proporciona la misma interfaz de programacion que se utiliza cuando se trabaja con ar-chivos
Ejemplo 1
El siguiente ejemplo ClienteFechajava muestra la implementacion de un cliente queaccede al servicio UNIX ldquofecha y horardquo El servidor concreto al que se conecta es alldquolocalhostrdquo El servicio ldquofecha y horardquo por convenio siempre esta en el puerto 13 Lo
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4049
Herramientas y Lenguajes de Programacion 06-07 38
que ocurre es que el software del servidor esta ejecutandose continuamente en la maquina
remota esperando cualquier trafico de red que ldquohable con el en el puerto 13 Cuando elSistema Operativo de este servidor recupera un paquete de red que contiene una peticionpara conectar con el puerto 13 activa el servicio de escucha del servidor y establece laconexion que permanece activa hasta que es finalizada por alguna de las dos partes
import javanet
import javaio
import javautil
class ClienteFecha
public static void main( String[] args )
String servidor = localhost
int puerto = 13 puerto de daytime
try
Se abre un socket conectado al servidor y al
puerto estandar de echo
Socket socket = new Socket( servidorpuerto )
Systemoutprintln( Socket Abierto )
Se consigue el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socketgetInputStream() ) )
Systemoutprintln( Hora actual en localhost )
Systemoutprintln( t+entradareadLine() )
Systemoutprintln( Hora actual con la clase date )Systemoutprintln( t + new Date() )
Se cierra el canal de entrada
entradaclose()
Se cierra el socket
socketclose()
catch( UnknownHostException e )
Systemoutprintln( e )
Systemoutprintln(
Debes estar conectado para que esto funcione bien )
catch( IOException e )
Systemoutprintln( e )
Ejemplo 2
El ejemplo EchoClientjava muestra la implementacion de un cliente que accede alservicio UNIX ldquoecordquo El servidor concreto al que se conecta es a ldquomanisrdquo en la EscuelaEl servicio ldquoecordquo por convenio siempre esta en el puerto 7 Aunque con frecuencia porrazones de seguridad esta cerrado
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4149
Herramientas y Lenguajes de Programacion 06-07 39
import javaioimport javanet
public class EchoClient
public static void main(String[] args) throws IOException
String serverName = exthostcsiulles
int portNumber = 7
Socket echoSocket = null
PrintWriter out = null
BufferedReader in = null
try
echoSocket = new Socket(serverName portNumber)
out = new PrintWriter(echoSocketgetOutputStream() true)in = new BufferedReader(new InputStreamReader( echoSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host + serverName)
Systemexit(1)
catch (IOException e)
Systemerrprintln(Couldnrsquot get IO for + the connection to + serverName)
Systemexit(1)
BufferedReader stdIn = new BufferedReader( new InputStreamReader(Systemin))
String userInput
while ((userInput = stdInreadLine()) = null) outprintln(userInput)
Systemoutprintln(echo + inreadLine())
outclose()
inclose()
stdInclose()
echoSocketclose()
822 La clase ServerSocketLa clase ServerSocket es la que se utiliza a la hora de crear servidores al igual que
como se ha visto la clase Socket se utilizaba para crear clientes
Ejemplo
Este ejemplo muestra como escribir un servidor y su cliente Esta sacado del Tutorialde Java de Sun El servidor sirve chistes Funciona de la siguiente forma
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4249
Herramientas y Lenguajes de Programacion 06-07 40
miranda~clasespsdgt java KnockKnockClient
Server Knock KnockWhorsquos there
Client Whorsquos there
Server Turnip
Turnip who
Client Turnip who
Server Turnip the heat itrsquos cold in here Want another (yn)
n
Client n
Server Bye
miranda~clasespsdgt
El ejemplo consta de dos programas Java ejecutandose de forma independiente KnockKnockClient
y KnockKnockServer Sin embargo esta constituido por tres ficheros
KnockKnockServerjava (implementacion del Servidor)
KnockKnockProtocoljava (implementacion del protocolo)
KnockKnockClientjava (implementacion del cliente)
83 La clase Thread y la implementacion de servidores
Existe un problema con el ejemplo del servidor de chistes de la seccion anterior Su-ponga que queremos permitir que varios usuarios se conecten a la vez Lo normal es que unservidor este ejecutandose constantemente en un ordenador y que los usuarios se conectensimultaneamente al mismo En el ejemplo que hemos visto solo se admite la conexion deun usuario Esto podemos arreglarlo usando threads
Cada vez que sepamos que el programa ha establecido una nueva conexi on esto essiempre que una peticion de servicio tenga exito lanzaremos un nuevo thread que sera elencargado de monitorizar la coneccion entre el servidor y ese cliente El programa principalsolo se encargara de seguir esperando nuevas conexiones Para implementar esto el bucleprincipal del servidor deberıa ser algo como
while (true)
Socket incoming = saccept()
Thread t = new ThreadServerHandler(incoming)
tstart()
La clase ThreadServerHandler extiende a la clase Thread y contiene el bucle de comu-nicacion entre el servidor y el cliente en su metodo run()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4349
Herramientas y Lenguajes de Programacion 06-07 41
class ThreadServerHandler extends Thread
public void run()
try
Establecer los flujos de entradasalida para el socket
Procesar las entradas y salidas segun el protocolo
cerrar el socket
catch (Excepction e)
manipular las excepciones
Ejemplo
Este ejemplo amplıa al de la seccion anterior mostrando como escribir un servidor queatiende a multiples clientes El modo de funcionamiento es exactamente el mismo
El ejemplo consta de dos programas Java ejecutandose de forma independiente Knock-
KnockClient y KKMultiServer Para probarlo en una terminal lance al servidor y endos o mas nuevas terminales lance a varios clientes La aplicacion esta constituida por lossiguientes ficheros
KnockKnockProtocoljava (implementacion del protocolo no cambia respecto al
ejemplo anterior)KnockKnockClientjava (implementacion del cliente no cambia respecto al ejemploanterior)
KKMultiServerThreadjava (implementacion de un thread Servidor)
KKMultiServerjava (implementacion del Servidor)
84 Ejercicios
1 Modificar el ejemplo Cliente de Eco del enunciado de manera que
Se especifique en la lınea de comandos el nombre de la maquina servidora y elnumero de puerto Si no se especifica nada el servidor por defecto ser a ldquolocal-host rdquo y el puerto el numero 7
Para indicar el final de una sesion cliente el usuario ha de introducir por tecladoun punto ldquordquo Cuando se introduzca un punto se ha de salir del bucle de entraday se ha de cerrar el socket de datos
Solucion
EchoClientjava
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4449
Herramientas y Lenguajes de Programacion 06-07 42
2 Implementar un servidor de ldquoecordquo como el que proporcionan los servidores Unix en
el puerto 7 Disene un servidor iterativo para ello
Se ha de especificar en la lınea de comandos el numero de puerto en el queel servidor acepta conexiones (por ejemplo 8180) Si no se especifica nada elnumero de puerto por defecto sera el 7
El servidor se ha de quedar esperando las solicitudes de conexion de los clientesUtilizando la clase BufferedReader junto con la clase InputStreamReader seha de abrir un flujo de entrada desde el socket servidor Con la clase PrintWriter
junto con la clase OutputStreamWriter abrir un flujo de salida al socket Elprograma ha de actuar como repetidor recogiendo las lıneas que llegan por elcanal de entrada y escribiendolas en el canal de salida hasta que el usuario le
indique que ha terminado escribiendo un punto ldquordquo Cuando ya no haya maslıneas que leer se recibira un punto lo cual hara que el servidor salga del buclede entrada y cierre el socket servidor
Para probar que funciona ejecute el programa servidor en un consola y en otraterminal escriba telnet 127001 8180
Solucion
EchoServerjava
MyStreamSocketjava
3 Con los dos programas anteriores realice las siguientes operaciones
Ejecute los programas empezando por el servidor y a continuaci on el clienteEn una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones en paraleloExplique su respuesta
4 Modificar el servidor de ldquoecordquo del ejercicio 2 para que sea un servidor concurrente
Solucion
EchoServerjava
5 Con el programa anterior y el cliente de eco del ejercicio 1 realice las siguientesoperaciones
Ejecute los programas empezando por el servidor y a continuaci on el cliente
En una terminal diferente arranque a otro cliente
Dibuje el diagrama de secuencia iquestSe pueden realizar las dos sesiones del cliente enparalelo Explique su respuesta
6 Describa las diferencias desde el punto de vista del cliente entre un servidor itera-tivo y un servidor concurrente para un servicio que involucre multiples rondas deintercambios de mensajes
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4549
Herramientas y Lenguajes de Programacion 06-07 43
85 Codigos Fuente del Servidor de chistes iterativo
import javanet
import javaio
public class KnockKnockProtocol
private static final int WAITING = 0
private static final int SENTKNOCKKNOCK = 1
private static final int SENTCLUE = 2
private static final int ANOTHER = 3
private static final int NUMJOKES = 5
private int state = WAITING
private int currentJoke = 0
private String[] clues = Turnip Little Old Lady Atch Who Who
private String[] answers = Turnip the heat itrsquos cold in here
I didnrsquot know you could yodel
Bless you
Is there an owl in here
Is there an echo in here
public String processInput(String theInput)
String theOutput = null
if (state == WAITING)
theOutput = Knock Knockstate = SENTKNOCKKNOCK
else if (state == SENTKNOCKKNOCK)
if (theInputequalsIgnoreCase(Whorsquos there))
theOutput = clues[currentJoke]
state = SENTCLUE
else
theOutput = Yoursquore supposed to say Whorsquos there +
Try again Knock Knock
else if (state == SENTCLUE)
if (theInputequalsIgnoreCase(clues[currentJoke] + who))
theOutput = answers[currentJoke] + Want another (yn)
state = ANOTHER
else theOutput = Yoursquore supposed to say +
clues[currentJoke] +
who +
Try again Knock Knock
state = SENTKNOCKKNOCK
else if (state == ANOTHER)
if (theInputequalsIgnoreCase(y))
theOutput = Knock Knock
if (currentJoke == (NUMJOKES - 1))
currentJoke = 0
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4649
Herramientas y Lenguajes de Programacion 06-07 44
else
currentJoke++state = SENTKNOCKKNOCK
else
theOutput = Bye
state = WAITING
return theOutput
import javaio
import javanet
public class KnockKnockClient
public static void main(String[] args) throws IOException
Socket kkSocket = null
PrintWriter out = null
BufferedReader in = null
try
kkSocket = new Socket(localhost 4444)
out = new PrintWriter(kkSocketgetOutputStream() true)
in = new BufferedReader(new InputStreamReader(kkSocketgetInputStream()))
catch (UnknownHostException e)
Systemerrprintln(Donrsquot know about host maniscsiulles)
Systemexit(1)
catch (IOException e) Systemerrprintln(Couldnrsquot get IO for the connection to maniscsiulles)
Systemexit(1)
BufferedReader stdIn = new BufferedReader(new InputStreamReader(Systemin))
String fromServer
String fromUser
while ((fromServer = inreadLine()) = null)
Systemoutprintln(Server + fromServer)
if (fromServerequals(Bye)) break
fromUser = stdInreadLine()
if (fromUser = null)
Systemoutprintln(Client + fromUser)
outprintln(fromUser)
outclose()
inclose()
stdInclose()
kkSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4749
Herramientas y Lenguajes de Programacion 06-07 45
import javanetimport javaio
public class KnockKnockServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
try
serverSocket = new ServerSocket(4444)
Systemoutprintln(estoy despues de crear el socket)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(1)
Socket clientSocket = null
try
clientSocket = serverSocketaccept()
Systemoutprintln(estoy despues de aceptar un cliente)
catch (IOException e)
Systemerrprintln(Accept failed)
Systemexit(1)
PrintWriter out = new PrintWriter(clientSocketgetOutputStream() true)
BufferedReader in = new BufferedReader(
new InputStreamReader(
clientSocketgetInputStream()))String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
outclose()
inclose()clientSocketclose()
serverSocketclose()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4849
Herramientas y Lenguajes de Programacion 06-07 46
86 Codigos Fuente del Servidor de chistes concurrente
import javanet
import javaio
public class KKMultiServer
public static void main(String[] args) throws IOException
ServerSocket serverSocket = null
boolean listening = true
try
serverSocket = new ServerSocket(4444)
catch (IOException e)
Systemerrprintln(Could not listen on port 4444)
Systemexit(-1)
while (listening)
new KKMultiServerThread(serverSocketaccept())start()
serverSocketclose()
import javanet
import javaio
public class KKMultiServerThread extends Thread
private Socket socket = null
public KKMultiServerThread(Socket socket)
super(KKMultiServerThread)
thissocket = socket
public void run()
try
PrintWriter out = new PrintWriter(socketgetOutputStream() true)
BufferedReader in = new BufferedReader( new InputStreamReader(
socketgetInputStream()))
String inputLine outputLine
KnockKnockProtocol kkp = new KnockKnockProtocol()
outputLine = kkpprocessInput(null)
outprintln(outputLine)
while ((inputLine = inreadLine()) = null)
outputLine = kkpprocessInput(inputLine)
outprintln(outputLine)
if (outputLineequals(Bye))
break
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()
572018 clases sokect - slidepdfcom
httpslidepdfcomreaderfullclases-sokect 4949
Herramientas y Lenguajes de Programacion 06-07 47
outclose()
inclose()socketclose()
catch (IOException e)
eprintStackTrace()