En este apartado se encuentra información referente a los distintos tipos de clientes que podemos identificar al momento de la venta de un producto.Descripción completa
investigacionDescripción completa
Descrição completa
Descripción: Trabajo academico de desarrollo cliente servidor
Descripción: Servidor DNS
Descripción: Servidor DHCP
Computadores y Comunicaciones Práctica de Laboratorio: Diseño de una aplicación basada en el modelo cliente-servidor Julián Viejo Cortés Jorge Juan Chico Marzo 2009
Computadores y Comunicaciones
Práctica Modelo Cliente-Servidor
Índice de contenidos
1. 2. 3. 4.
Introducción....................................................................................................2 Ejemplo 1: Aplicación básica..........................................................................2 Ejemplo 2: Aplicación interactiva...................................................................3 Anexos: Códios de los ejemplos....................................................................4 4.1. Códios del Ejemplo 1..............................................................................4 4.1.1. !ervidor básico...............................................................................................4 4.1.2. Cliente básico................................................................................................."
1. Introducción Esta práctica de laboratorio tiene como objetivo mostrar el %uncionamiento de las aplicaciones basadas en el modelo cliente&servidor. 'ara ello( se )a desarrollado una serie de ejemplos sobre un sistema Ubuntu/Linux( en concreto: ●
Ejemplo 1: Aplicación básica.
●
Ejemplo 2: Aplicación interactiva.
En todos los casos( se proporcionará a los alumnos el códio %uente de los proramas( de %orma *ue el trabajo a reali+ar consiste en completar los di%erentes apartados *ue se plantean. ,os ejemplos propuestos están implementados utili+ando el lenuaje de proramación Python. En principio no es necesario instalar nin-n prorama( aun*ue s será necesario utili+ar un editor de texto plano /nano( edit( etc.0 para la visuali+ación del contenido de los arc)ivos.
2. Ejemplo 1: Aplicación básica En este primer ejemplo vamos a partir de dos proramas escritos en lenuaje Python( teniendo los alumnos *ue reali+ar las siuientes tareas: 1. escarar desde la páina eb de la asinatura el %ic)ero comprimido ejemplos_c_s!ip. 2. escomprimir el contenido del %ic)ero .+ip dentro de la carpeta personal /)omecurso0. 3. Abrir un terminal entrar dentro de la carpeta c_s_basico: $ cd ejemplos_c_s/c_s_basico
4. Anali+ar los códios proporcionados( leendo comprendiendo los comentarios. 'ara visuali+ar estos códios usar un editor de texto: $ gedit servidor_basico.py cliente_basico.py
". Ejecutar las aplicaciones servidor cliente: ●
'rimero( lan+ar el servidor:
$ python servidor_basico.py 9000 ●
!eundo( lan+ar en un nuevo terminal el cliente:
$ python cliente_basico.py localhost 9000
#. Comprobar el correcto %uncionamiento de la aplicación leendo los mensajes *ue se imprimen en los terminales. A continuación( responder brevemente a las siuientes cuestiones: 1. entro de la aplicación servidor( con la llamada a la %unción listenin"_soc#etlisten$ 5en *u6 estado solicitamos *ue se abra el 2
Computadores y Comunicaciones
Práctica Modelo Cliente-Servidor
conector /soc#et0 creado con la llamada a esta %unción7 2. entro de la aplicación cliente( con la llamada a la %unción connection_soc#etconnect( 5con *ui6n se está intentando establecer una conexión en *u6 puerto7 3. Con la llamada a la %unción listenin"_soc#etaccept$ dentro de la aplicación servidor( 5*u6 estamos aceptando7 5*u6 se )a establecido7 4. 58u6 ocurre si ejecutamos antes el cliente *ue el servidor7
3. Ejemplo 2: Aplicación interactiva En este seundo ejemplo( partiendo de la aplicación del ejemplo 1( vamos a mejorar los dos proramas para *ue tanto el cliente como el servidor puedan interaccionar /intercambiar mensajes de texto0. ,os alumnos reali+arán las siuientes tareas: 1. Estando dentro c_s_interactivo:
del
directorio
c_s_basico( moverse
al directorio
$ cd ../c_s_interactivo
2. Anali+ar los códios proporcionados( leendo comprendiendo los comentarios. 'ara visuali+ar estos códios usar un editor de texto: $ gedit servidor_interactivo.py cliente_interactivo.py
3. Ejecutar las aplicaciones servidor cliente: ●
'rimero( lan+ar el servidor:
$ python servidor_interactivo.py 9000 ●
!eundo( lan+ar en un nuevo terminal el cliente:
$ python cliente_interactivo.py localhost 9000
4. Escribir mensajes tanto en la parte del cliente como en la del servidor comprobar el correcto %uncionamiento de la aplicación. A continuación( responder brevemente a las siuientes cuestiones: 1. 58u6 llamadas deben )acerse desde la lnea de comando para conectarse a otra má*uina *ue no sea el l ocalhost7 2. Con6ctese a la má*uina de su compa9ero e interaccione con 6l.
3
Computadores y Comunicaciones
Práctica Modelo Cliente-Servidor
4. Anexos: Códios de los ejemplos Estos códios están basados inicialmente pro"rammin" por 'aul ;arrison.
en
ejemplos
de
%et&or#
4.1. Códios del Ejemplo 1 4.1.1. !ervidor básico import sys, os from socket import * from time import * # Establece el puerto en el que va a escuchar el servidor (será un # parámetro pasado por la línea de comandos). if(len(sys.arv) ! ") port $ int(sys.arv%"&) else print 'so python servidorbasico serverport' sys.eit(") # +rea un socket para escuchar en espera de nuevas coneiones. listeninsocket $ socket(-/E0,12+3104E5) # +onecta el socket a un puerto en el que escuchar. 16lo root puede # escuchar en puertos por deba7o de "89:. listeninsocket.bind((;;, port)) # . listeninsocket.listen(") # n socket que escucha s6lo sirve para escuchar. +uando se establece una # conei6n se crea un nuevo socket para el intercambio de informaci6n. ?hile " # Espera a que haya una conei6n y la acepta. acceptedsocket, address $ listeninsocket.accept() # # # #
l aceptar una conei6n se crea un nuevo socket de forma que el servidor puede seuir escuchando en el socket de escucha en espera de nuevas coneiones. En nuestro caso, se muestra un mensa7e, se cierra la conei6n y se espera una nueva conei6n.
# +rea los ficheros asociados con el socket. @ermite leer y escribir # del socket como si de un fichero se tratase. incominstream $ acceptedsocket.makefile('rt') outoinstream $ acceptedsocket.makefile('?t') # +rea un teto con la hora local. localtime $ ctime()
4
Computadores y Comunicaciones
Práctica Modelo Cliente-Servidor
# Envía la hora al cliente outoinstream.?rite(localtime A 'Bn') #
4.1.2. Cliente básico
import sys, os from socket import * # Establece el nombre y el puerto del servidor (serán dos parámetros # pasados por la línea de comandos). if(len(sys.arv) ! 9) servername$sys.arv%"& serverport $ int(sys.arv%9&) else print 'so python clientebasico servername serverport' sys.eit(") # 2btiene la direcci6n @ correspondiente al servidor. serveraddress $ ethostbyname(servername) # +rea un socket. connectionsocket $ socket(-/E0,12+3104E5) # +onecta el socket al servidor. connectionsocket.connect((serveraddress, serverport)) # +rea los ficheros asociados con el socket. @ermite leer y escribir del # socket como si de un fichero se tratase. incominstream $ connectionsocket.makefile('rt') outoinstream $ connectionsocket.makefile('?t') # hora el cliente puede comunicarse con el servidor. # Cee la hora y la imprime en la salida estándar (monitor). print incominstream.read() # +ierra la conei6n y termina incominstream.close() outoinstream.close() connectionsocket.close()
"
Computadores y Comunicaciones
Práctica Modelo Cliente-Servidor
4.2. Códios del Ejemplo 2 4.2.1. !ervidor interactivo import sys, os from socket import * # Establece el puerto en el que va a escuchar el servidor (será un # parámetro pasado por la línea de comandos). if(len(sys.arv) ! ") port $ int(sys.arv%"&) else print 'so python servidorinteractivo serverport' sys.eit(") # +rea un socket para escuchar en espera de nuevas coneiones. listeninsocket $ socket(-/E0,12+3104E5) # +onecta el socket a un puerto en el que escuchar. 16lo root puede # escuchar en puertos por deba7o de "89:. listeninsocket.bind((;;, port)) # . listeninsocket.listen(") # n socket que escucha s6lo sirve para escuchar. # Espera a que haya una conei6n y la acepta. # +uando se establece una conei6n se crea un nuevo socket para el # intercambio de informaci6n. acceptedsocket, address $ listeninsocket.accept() # El actual proceso se divide en dos # ". @roceso padre se encara de leer los mensa7es procedentes del cliente # y de imprimirlos en pantalla # 9. @roceso hi7o recoe mensa7es de la entrada estándar y los envía al # cliente pid $ os.fork() if pid D$ 8 # Entrando en el proceso padre # +errar el socket de escucha listeninsocket.close() # @ermite leer del socket como si de un fichero se tratase. incominstream $ acceptedsocket.makefile('rt') print 'El servidor acepta mensa7es del cliente' # 1e entra en un bucle cada ve> que el cliente envía un mensa7e lo # imprimimos # 1i el mensa7e es salir el cliente quiere desconectarse por lo que # el servidor no aceptará más mensa7es ?hile 0rue
#
Computadores y Comunicaciones
Práctica Modelo Cliente-Servidor
ms $ incominstream.readline() print ms if ms $$ 'salirBn' break # 1e cierran los sockets incominstream.close() acceptedsocket.close() print '+liente desconectado. 1i no está desconectado escriba salir' os.?aitpid(pid, 8) else # Entrando en el proceso hi7o # +errar el socket de escucha listeninsocket.close() # @ermite escribir en el socket como si de un fichero se tratase. outoinstream $ acceptedsocket.makefile('?t') print 'El servidor permite mandar mensa7es al cliente' # 1e entra en un bucle se lee de la entrada estándar (teclado) los # mensa7es y se envían al cliente. @ara desconectar escribimos salir ?hile 0rue ms $ ra?input() outoinstream.?rite(ms A 'Bn') outoinstream.flush() if ms $$ 'salir' break # 1e cierran los sockets outoinstream.close() acceptedsocket.close() # -in del proceso hi7o sys.eit(8)
4.2.2. Cliente interactivo import sys, os from socket import * # Establece el nombre y el puerto del servidor (serán dos parámetros # pasados por la línea de comandos). if(len(sys.arv) ! 9) servername$sys.arv%"& serverport $ int(sys.arv%9&) else print 'so python clienteinteractivo servername serverport' sys.eit(") # 2btiene la direcci6n @ correspondiente al servidor. serveraddress $ ethostbyname(servername) # +rea un socket.
$
Computadores y Comunicaciones
Práctica Modelo Cliente-Servidor
connectionsocket $ socket(-/E0,12+3104E5) # +onecta el socket al servidor. connectionsocket.connect((serveraddress, serverport)) # El actual proceso se divide en dos # ". @roceso padre se encara de leer los mensa7es procedentes del # servidor y de imprimirlos en pantalla # 9. @roceso hi7o recoe mensa7es de la entrada estándar y los envía al # servidor pid $ os.fork() if pid D$ 8 # Entrando en el proceso padre # @ermite leer del socket como si de un fichero se tratase. incominstream $ connectionsocket.makefile('rt') print 'El cliente acepta mensa7es del servidor' # 1e entra en un bucle cada ve> que el servidor envía un mensa7e lo # imprimimos # 1i el mensa7e es salir el servidor quiere desconectarse por lo que # el cliente no aceptará más mensa7es ?hile 0rue ms $ incominstream.readline() print ms if ms $$ 'salirBn' break # 1e cierran los sockets incominstream.close() connectionsocket.close() print '1ervidor desconectado. 1i no está desconectado escriba salir' os.?aitpid(pid, 8) else # Entrando en el proceso hi7o # @ermite escribir en el socket como si de un fichero se tratase. outoinstream $ connectionsocket.makefile('?t') print 'El cliente permite mandar mensa7es al servidor' # 1e entra en un bucle se lee de la entrada estándar (teclado) los # mensa7es y se envían al servidor. @ara desconectar escribimos salir ?hile 0rue ms $ ra?input() outoinstream.?rite(ms A 'Bn') outoinstream.flush() if ms $$ 'salir' break # 1e cierran los sockets . outoinstream.close() connectionsocket.close() # -in del proceso hi7o sys.eit(8)