49
Herramientas y Lenguajes de Programaci´on Coromoto Le´ on Hern´ andez 1, 5 cr´ edito s Universidad de La Laguna Programa de Doctorado de F´ ısica e Inform´ atica Dpto. de Estad´ ıstica, I.O. y Computaci´ on 2006-2007

clases sokect

Embed Size (px)

Citation preview

Page 1: clases sokect

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()

Page 2: clases sokect

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()

Page 3: clases sokect

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()

Page 4: clases sokect

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()

Page 5: clases sokect

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()

Page 6: clases sokect

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()

Page 7: clases sokect

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()

Page 8: clases sokect

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()

Page 9: clases sokect

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()

Page 10: clases sokect

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()

Page 11: clases sokect

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()

Page 12: clases sokect

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()

Page 13: clases sokect

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()

Page 14: clases sokect

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()

Page 15: clases sokect

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()

Page 16: clases sokect

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()

Page 17: clases sokect

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()

Page 18: clases sokect

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()

Page 19: clases sokect

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()

Page 20: clases sokect

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()

Page 21: clases sokect

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()

Page 22: clases sokect

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()

Page 23: clases sokect

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()

Page 24: clases sokect

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()

Page 25: clases sokect

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()

Page 26: clases sokect

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()

Page 27: clases sokect

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()

Page 28: clases sokect

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()

Page 29: clases sokect

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()

Page 30: clases sokect

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()

Page 31: clases sokect

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()

Page 32: clases sokect

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()

Page 33: clases sokect

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()

Page 34: clases sokect

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()

Page 35: clases sokect

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()

Page 36: clases sokect

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()

Page 37: clases sokect

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()

Page 38: clases sokect

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()

Page 39: clases sokect

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()

Page 40: clases sokect

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()

Page 41: clases sokect

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()

Page 42: clases sokect

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()

Page 43: clases sokect

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()

Page 44: clases sokect

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()

Page 45: clases sokect

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()

Page 46: clases sokect

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()

Page 47: clases sokect

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()

Page 48: clases sokect

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()

Page 49: clases sokect

572018 clases sokect - slidepdfcom

httpslidepdfcomreaderfullclases-sokect 4949

Herramientas y Lenguajes de Programacion 06-07 47

outclose()

inclose()socketclose()

catch (IOException e)

eprintStackTrace()