Cliente Servidor #Python Ejemplo 2

Es mas que nada un juguete , nada serio, ya que tiene muchos pero muchos detalles, a medida que iré lvl en Python voy publicando algunas casillas .

El asunto Dice así:

“Se le a pedido crear un sistema de administración para una cadena hotelera, la cual ha solicitado crear un sistema de registro de clientes, los cuales al llegar al hotel solicitan la disponibilidad de habitaciones, en caso de haber habitaciones disponibles se debe imprimir en pantalla que habitaciones están disponibles, en caso de no haber habitaciones disponibles se debe informar al cliente que no se posee habitaciones para asignar. Este sistema debe poseer funciones para listar los precios de las habitaciones, como también para asignar la habitación al cliente.

Esta plataforma debe contar con un inicio de sesión antes de entrar al sistema. El hotel consta de 100 habitaciones entre ellas un penthouse, 9 habitaciones king, 70 habitaciones dobles y 20 habitaciones simples.

Como está de moda, a querido implementar una estructura distribuida, cliente-servidor,  utilizando socket TCP, para la comunicación entre cliente y servidor, donde en el servidor estarán almacenadas las funciones que procesaran la información del hotel y en el cliente se mostrará la interfaz para comunicarse con dicho servidor, el cual estará a la espera de los parámetros para ser procesados.”

primero cree la estructura del hotel , cree una clase para las pesas y mediante herencia las subdividí en los != tipo que tenia, otra opción es crear una matriz y otra opción es utilizar una Base de datos , etc hasta el infinito de opciones. (La idea de la Base de datos me gusto, el único problema es que ya tenia echa la tarea cuando se me ocurrió :P)

el asunto me quedo así:

#!/usr/bin/python

class habitacion:
    def __init__(self,numero, estado, precio):
        self.numero = numero
        self.estado = estado
        self.precio = precio
    def tell(self):
        print 'Numero = "%i" , Estado = "%i" , Precio = "%i"  ' %(self.numero, self.estado, self.precio),
    def getNumero(self):
        return self.numero
    def getEstado(self):
        return self.estado    
    def getPrecio(self):
        return self.precio
    def setEstado(self, estado):
        self.estado=estado

class penthouse(habitacion):
    def __init__(self,numero, estado, precio):
        habitacion.__init__(self,numero, estado,precio)
        self.tipo="Penthouse"
    def getTipo(self):
        return self.tipo
        def getNumero(self):
                return self.numero
        def getEstado(self):
                return self.estado
        def getPrecio(self):
                return self.precio
        def setEstado(self, estado):
                self.estado=estado
    def tell(self):
        print 'Tipo = "%s",Numero = "%i" , Estado = "%i" , Precio = "%i"  ' %(self.tipo, self.numero, self.estado, self.precio),

class h_king(habitacion):
    def __init__(self, numero, estado, precio):
        habitacion.__init__(self,numero, estado,precio)

n        self.tipo="King"
        def getTipo(self):
                return self.tipo
        def getNumero(self):
                return self.numero
        def getEstado(self):
                return self.estado
        def getPrecio(self):
                return self.precio
        def setEstado(self, estado):
                self.estado=estado
    def tell(self):
        print 'Tipo = "%s",Numero = "%i" , Estado = "%i" , Precio = "%i"  ' %(self.tipo, self.numero, self.estado, self.precio),

class h_dobles(habitacion):
        def __init__(self, numero, estado, precio):
                habitacion.__init__(self,numero, estado,precio)
                self.tipo="Doble"
        def getTipo(self):
                return self.tipo
        def getNumero(self):
                return self.numero
        def getEstado(self):
                return self.estado
        def getPrecio(self):
                return self.precio
        def setEstado(self, estado):
                self.estado=estado
        def tell(self):
                print 'Tipo = "%s",Numero = "%i" , Estado = "%i" , Precio = "%i"  ' %(self.tipo, self.numero, self.estado, self.precio),

class h_simple(habitacion):
        def __init__(self, numero, estado, precio):
                habitacion.__init__(self,numero, estado,precio)
                self.tipo="Simple"
        def getTipo(self):
                return self.tipo
        def getNumero(self):
                return self.numero
        def getEstado(self):
                return self.estado
        def getPrecio(self):
                return self.precio
        def setEstado(self, estado):
                self.estado=estado
        def tell(self):
                print 'Tipo = "%s",Numero = "%i" , Estado = "%i" , Precio = "%i"  ' %(self.tipo, self.numero, self.estado, self.precio),

ahora vamos a crear el servidor, por allí explique el mecanismo cliente servidor , en este programa agregue solamente algunas funciones para que interactuaran a lvl de habitaciones , pero básicamente es el mismo.

acá el servidor tanto como el cliente se responden.

#!/usr/bin/python

import hab
import socket

s = socket.socket()
s.bind(("localhost", 4949))
s.listen(1)
sc, addr = s.accept()

print "Cargando Usuarios"

usuarios =['admin', 'leo', 'otro'] #todos los usuarios
claves=['admin', '123qwe', '123'] #las contrasenas de los usuarios

u="false" #validar usuario
p="false" #validar contrasena
cont=-1 #contador para relacionar usuario[cont] con su contrasena ( clave[cont])
cont2=0 #contador de intentos para ingresar contrasena
print "Cargando Habitaciones ....."

h = {}

#Creando el arreglo de habitaciones :

for i in range(1, 100):
    if i == 1:
        h[i] = hab.penthouse(i,0,150000)
    if i >1 and i <= 10:
        h[i]= hab.h_king(i,0,85000)
    if i>10 and i<=71:
        h[i]= hab.h_dobles(i,0,35000)
    if i>71:
        h[i] = hab.h_simple(i,0,17000)

print "Conectado ..."

#ingreso de usuario
while u == "false":
    recibido = sc.recv(1024)
    if recibido == "exit":
        print "Cerrando"
        break
    for i in range(0, 3):
        if usuarios[i] == recibido:
            u = "true"
            cont =i
    sc.send(u)
#ingreso de clave
while p == "false" and cont2 <=3:
    recibido = sc.recv(1024)
    if claves[cont]==recibido:
        p="true"
    cont2 = cont2+1
    if cont2 > 3:
        p="error"
    sc.send(p)
    if p=="error":
        break

#Hotel

while True and p != "error":
        recibido = sc.recv(1024)
        if recibido == "exit":
                
break
#ver habitaciones disponibles
    #ver habitaciones Penthouse
    if recibido == "1":
        mensaje = "Penthouse diponible \n"
        bool = "false"
         for i in range(1,100):
            if h[i].getTipo()=="Penthouse" and h[i].getEstado() == 0:
                if bool == "false":
                    mensaje = "----------------------\n| Numero   | Estado  |\n----------------------\n"
                numero = h[i].getNumero()
                mensaje = mensaje + "|   %i     |Disponble|\n"  %numero
                bool = "true"

        if bool == "false":
            mensaje = mensaje + "===> No hay habitaciones disponibles\n"
        if bool == "true":
            mensaje = mensaje + "----------------------\n"
        sc.send(mensaje)
    #ver habitaciones king
    if recibido == "2":
        mensaje = "Habitaciones King disponibles \n"
        bool = "false"
                for i in range(1,100):
                        if h[i].getTipo()=="King" and h[i].getEstado() == 0:
                                if bool == "false":
                                        mensaje = "----------------------\n| Numero   | Estado  |\n----------------------\n"
                                numero = h[i].getNumero()
                                mensaje = mensaje + "|   %i     |Disponble|\n"  %numero
                                bool = "true"

                if bool == "false":
                        mensaje = mensaje + "===> No hay habitaciones disponibles\n"
                if bool == "true":
                        mensaje = mensaje + "----------------------\n"
                sc.send(mensaje)

    #ver habitaciones dobles
        if recibido == "3":
                mensaje = "Habitaciones Dobles disponibles"
        bool = "false"
                for i in range(1,100):
                        if h[i].getTipo()=="Doble" and h[i].getEstado() == 0:
                                if bool == "false":
                                        mensaje = "----------------------\n| Numero   | Estado  |\n----------------------\n"
                                numero = h[i].getNumero()
                                mensaje = mensaje + "|   %i     |Disponble|\n"  %numero
                                bool = "true"

                if bool == "false":
                        mensaje = mensaje + "===> No hay habitaciones disponibles\n"
                if bool == "true":
                        mensaje = mensaje + "----------------------\n"
                sc.send(mensaje)

    #ver habitaciones simples
        if recibido == "4":
                mensaje = "Habitaciones Simple disponibles"
        bool = "false"
                for i in range(1,100):
                        if h[i].getTipo()=="Simple" and h[i].getEstado() == 0:
                                if bool == "false":
                                        mensaje = "----------------------\n| Numero   | Estado  |\n----------------------\n"
                                numero = h[i].getNumero()
                                mensaje = mensaje + "|   %i     |Disponble|\n"  %numero
                                bool = "true"

                if bool == "false":
                        mensaje = mensaje + "===> No hay habitaciones disponibles\n"
                if bool == "true":
                        mensaje = mensaje + "----------------------\n"
                sc.send(mensaje)

    #Ocupar una habitacion
    if recibido == "5":
        print "entro en 5"
        mensaje =" "
        recibido2 = sc.recv(1024)
        for i in range(1,100):
                        if h[i].getNumero() == int(recibido2) and h[i].getEstado() == 1:
                                mensaje = "===> 
Habitacion Ocupada"

            if h[i].getNumero() == int(recibido2) and h[i].getEstado() == 0:
                h[i].setEstado(1)
                mensaje = mensaje + "===> Habitacion %i tomada" %i
        sc.send(mensaje)

    #Desocupar una habitacion
        if recibido == "6":
                print "entro en 6"
                mensaje =" "
                recibido2 = sc.recv(1024)
                for i in range(1,100):

                        if h[i].getNumero() == int(recibido2) and h[i].getEstado() == 0:
                                mensaje = "===> Habitacion ya estaba Desocupada"
                        if h[i].getNumero() == int(recibido2) and h[i].getEstado() == 1:
                                h[i].setEstado(0)
                                mensaje = "===> Habitacion %i Desocupada" %i
                sc.send(mensaje)

    if recibido == "7":
        print "entro en 7"
        mensaje = "----------------------\n"
        mensaje = mensaje + "|Habitacion |  $     |\n"
        mensaje = mensaje + "----------------------\n"
        mensaje = mensaje + "| Penthouse | %i |\n" %h[1].getPrecio()
        mensaje = mensaje + "|   King    | %i  |\n" %h[2].getPrecio()
        mensaje = mensaje + "|   Doble   | %i  |\n" %h[50].getPrecio()
        mensaje = mensaje + "|   Simple  | %i  |\n" %h[90].getPrecio()
        mensaje = mensaje + "----------------------"
        sc.send(mensaje)

    if recibido >"7":
        sc.send("===> Opcion no valida")

    print "Recibido:", recibido
print "Desconectado"

sc.close()
s.close()

y por ultimo el cliente :), lo más fácil, ya que solo consulta y espera respuesta, nada que procesar.

import socket
import os, sys

s = socket.socket()
s.connect(("localhost", 4949))
#s.connect(("localhost", 9999))

u="false"
p="false"
#usuario
while u=="false":
    print "USUARIO:\n"
    mensaje = raw_input("> ")
    s.send(mensaje)
    if mensaje == "exit":
        print "===> Cerrando"
        break
    datos = s.recv(1024)
    if datos == "true":
        u="true"
#clave
while p=="false":
        print "CLAVE:\n"
        mensaje = raw_input("> ")
        s.send(mensaje)
        datos = s.recv(1024)
    if datos == "error":
        print "===> limite de intentos"
        p = "error"
        break
        if datos == "true":
                p="true"

while True and p != "error":
    os.system("clear")
    print "----------------------"
    print "-                    -"
    print "-     MENU HOTEL     -"
    print "-                    -"
    print "----------------------"
    print
    print "HABITACIONES DISPONIBLES"
    print "   1-Ver Penthouse "
    print "   2-Ver King"
    print "   3-Ver Dobles"
    print "   4-Ver Simples"
    print
    print "TOMAR UNA HABITACION"
    print "   5-Tomar Habitacion"
    print
    print "DESOCUPAR HABITACION"
    print "   6-Desocupar Habitacion"
    print
    print "VER PRECIOS"
    print "   7-Ver Precios"
    print        
    print "exit para salir ..."

    mensaje = raw_input("> ")
    s.send(mensaje)

    if mensaje == "exit":
        break

    if mensaje == "5":
        #s.send("5")
        print  "Ingrese el numero de la habitacion"
        mensaje = raw_input("> ")
            s.send(mensaje)
        #datos = s.recv(1024)
        #print datos

        if mensaje == "6":
                #s.send("5")
                print  "Ingrese el numero de la habitacion"
                mensaje = raw_input("> ")
                s.send(mensaje)
                #datos = s.recv(1024)
 
               #print datos

        print "Mensaje enviado, esperando respuesta..."
        # Imprimimos la respuesta del server.
        datos = s.recv(2048)
        print datos

    raw_input("Enter para continuar...")
print "adios"
s.close()

bueno espero que por allí , saquen más de una duda, el código esta bien simple por todos lados.

obviamente hay mejor formas de implementar una solución mejor pero el fin de esto es usar socket TCP .

“Supuestamente” ahora debería estar trabajando en una especie de Skype para GNU Linux, onda mandar mensaje (chat) + Video + Sonido , en cuando lo tenga màs o menos armado lo publico 😉

Saludos!