コード例 #1
0
 def consultar(self):
     try:
         self.iniciarSocket()
         self.solicitud = {
             'token': str(self.token),
             'operacion': 'consultar',
             'parametros': False,
             'iniciar': False
         }
         peticionJSON = json.dumps(self.solicitud, separators=(',', ':'))
         self.sock.send(peticionJSON.encode())
         respuesta = self.sock.recv(maxData)
         # Regresa un -1 cuando hay algun error en la transaccion
         if (respuesta == b'Se acabo el tiempo, sesion finalizada'):
             messagebox.showinfo("Notificacion",
                                 "Se acabo el tiempo, sesion finalizada")
             return -1
         elif (respuesta == b'ERROR EN LA TRANSACCION'
               or respuesta == b'Token invalido'):
             messagebox.showinfo("Error", "Error D:")
             return -1
         else:
             agregarHistorial(' C ** Consulta por > ' +
                              str(self.nombreCliente) + ' Saldo actual: ' +
                              str(impresion(respuesta)))
             messagebox.showinfo(
                 "Consulta SALDO",
                 str(self.nombreCliente) +
                 " el saldo actual de la cuenta es de $ " +
                 str(impresion(respuesta)))
         self.cerrarSocket()
     except:
         agregarHistorial(" C ** No se pudo realizar la consulta")
         return -1
コード例 #2
0
 def iniciarSocket(self):
     try:
         self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         self.sock.connect(direccionServidor)
     except:
         agregarHistorial(' C ** Error en la conexion con el SERVIDOR')
         messagebox.showinfo("Error", "Fallo en la conexion")
コード例 #3
0
 def cerrarSesion(self):
     try:
         self.iniciarSocket()
         self.solicitud = {
             'token': str(self.token),
             'operacion': 'cerrarSesion',
             'parametros': None,
             'iniciar': False
         }
         peticionJSON = json.dumps(self.solicitud, separators=(',', ':'))
         self.sock.send(peticionJSON.encode())
         respuesta = self.sock.recv(MAX_DATA)
         # Regresa un -1 cuando hay algun error en la transaccion
         if (respuesta == b'Se acabo el tiempo, sesion finalizada'):
             messagebox.showinfo("Notificacion",
                                 "Se acabo el tiempo, sesion finalizada")
             return -1
         elif (respuesta == b'ERROR EN LA TRANSACCION'
               or respuesta == b'Token invalido'):
             messagebox.showinfo("Error", "Error D:")
             return -1
         else:
             agregarHistorial(' C ** Finalizo sesion ' +
                              str(self.nombreCliente) + ' ,' +
                              str(impresion(respuesta)))
             messagebox.showinfo(
                 "Adios", "Ha finalizado sesion " + self.nombreCliente)
         self.sock.close()
     except:
         return -1
コード例 #4
0
 def retirar(self, monto, token, bloqueo):
     agregarHistorial(' 0 ** Operacion retirar T >> ' +
                      str(impresion(token)))
     # Se verifica que se tenga el saldo sufiente para poder hacer un retiro
     if float(monto) > self.saldo:
         resultado.put(-1)
     else:
         self.saldo = self.saldo - float(monto)
         resultado.put(self.saldo)
コード例 #5
0
 def abrirTransaccion(self):
     agregarHistorial(' O ** Estado cuenta >> ' + str(self.bloqueado))
     # Se establece el tiempo que la sesión de un cliente
     # puede mantenerse abierta
     self.timeout()
     # Caso de que se este haciendo alguna transacción de
     # retiro o depositó, no se podrá abrir una transaccion,
     # es decir, no se podrá iniciar sesion
     if (self.bloqueado):
         agregarHistorial(
             ' O ** ABORTA TRANSACCIÓN >> La cuenta esta siendo utilizada por otro cliente '
         )
         return self.abortaTransaccion(
             ' La cuenta esta siendo utilizada por otro cliente ')
     else:
         self.tokenActual = generarPassword(6)
         return self.token(self.tokenActual)
コード例 #6
0
 def iniciarSesion(self):
     try:
         self.iniciarSocket()
         self.solicitud = {'iniciar': True, 'cliente': self.nombreCliente}
         peticionJSON = json.dumps(self.solicitud, separators=(',', ':'))
         self.sock.send(peticionJSON.encode())
         token = self.sock.recv(maxData)
         if (len(token) == 6):
             self.token = token
             agregarHistorial(' C ** Inicio sesion ' +
                              str(self.nombreCliente) + ' > T: ' +
                              str(impresion(self.token)))
             messagebox.showinfo("Bienvenido",
                                 "Ha iniciado sesion " + self.nombreCliente)
             self.cerrarSocket()
             # Regresa 1 si se inicio correctamente la sesión
             return 1
         else:
             self.token = None
             agregarHistorial(' C ** Error al iniciar sesion ' +
                              str(self.nombreCliente) + ' > T: ' +
                              str(impresion(self.token)))
             messagebox.showinfo(
                 "Error", "No se ha podido iniciar sesion " +
                 str(self.nombreCliente) + ". Intente de nuevo")
             self.cerrarSocket()
             # Regresa 0 si no se inicio correctamente la sesión
             return 0
     except:
         agregarHistorial(" C ** No se pudo realizar la consulta")
         return 0
コード例 #7
0
 def retirar(self, monto):
     try:
         self.iniciarSocket()
         self.solicitud = {
             'token': str(self.token),
             'operacion': 'retirar',
             'parametros': monto,
             'iniciar': False
         }
         peticionJSON = json.dumps(self.solicitud, separators=(',', ':'))
         self.sock.send(peticionJSON.encode())
         respuesta = self.sock.recv(maxData)
         # Regresa un -1 cuando hay algun error en la transaccion
         if (respuesta == b'Se acabo el tiempo, sesion finalizada'):
             messagebox.showinfo("Notificacion",
                                 "Se acabo el tiempo, sesion finalizada")
             return -1
         elif (respuesta == b'ERROR EN LA TRANSACCION'
               or respuesta == b'Token invalido'):
             messagebox.showinfo("Error", "Error D:")
             return -1
         # Se indica cuando no hay saldo insuficiente
         elif (respuesta == b' Saldo insuficiente'):
             messagebox.showinfo("Error", "Saldo insuficiente en la cuenta")
         # Se indica que se realizó el retiro
         else:
             messagebox.showinfo(
                 "Retiro",
                 str(self.nombreCliente) + " realizo un retiro de $ " +
                 str(monto) + '\n*** Saldo actual $ ' +
                 str(impresion(respuesta)))
             agregarHistorial(' C ** Retiro por > ' +
                              str(self.nombreCliente) + ' Saldo actual: ' +
                              str(impresion(respuesta)))
         self.cerrarSocket()
     except:
         agregarHistorial(" C ** No se pudo realizar el retiro")
         return -1
コード例 #8
0
 def token(self, token):
     agregarHistorial(' 0 ** Token actual ' + str(impresion(token)))
     return token
コード例 #9
0
 def timeout(self):
     self.timeoutVal = time.time()
     agregarHistorial(' O ** Inicia el tiempo de espera ')
     # Se establecen 2 minutos para la sesion
     self.timeoutVal += 120.0
コード例 #10
0
 def depositar(self, monto, token, bloqueo):
     agregarHistorial(' O ** Operacion depositar T >> ' +
                      str(impresion(token)))
     self.saldo = self.saldo + float(monto)
     resultado.put(self.saldo)
コード例 #11
0
 def consultar(self, token):
     agregarHistorial(' O ** Operacion consultar  T >> ' +
                      str(impresion(token)))
     return self.saldo
コード例 #12
0
    def operar(self, token, operacion, parametros=None):
        # Se verifica que la transaccion a implementar tenga un token
        if (str(impresion(token)) == "" or len(str(impresion(token))) != 12):
            agregarHistorial(' 0 ** >> TOKEN INVALIDO **** T: ' +
                             str(impresion(token)))
            return self.abortaTransaccion('Token invalido')

        # Se verifica que no se haya terminado el tiempo de sesión
        if (self.timeoutVal < time.time()):
            self.sesionFinalizada = True
            agregarHistorial(' 0 ** >> TOKEN DEL CLIENTE FINALIZADO **** T: ' +
                             str(impresion(token)))
            return self.abortaTransaccion(
                'Se acabo el tiempo, sesion finalizada')

        # Se verifica si la cuenta esta siendo ocupada
        # En caso se que si, la transaccion se queda esperando
        while (self.bloqueado == True):
            if (self.aux == True):
                # Se registra una espera para poder modificar el recurso
                agregarHistorial(' 0 ** >> CUENTA BLOQUEDA ... ESPERANDO')
                self.aux = False

        # Operacion consultar
        if (operacion == 'consultar'):
            # La operacion consultar no requiere bloqueo
            ope = Transaccion(self.saldo)
            self.saldo = ope.consultar(token)
            return self.saldo

        elif (operacion == 'depositar'):
            self.bloqueado = True
            # Para solicitar un bloqueo si la cuenta se esta usando
            bloquear = thread.allocate_lock()
            agregarHistorial(' O ** Se bloquea la cuenta')
            # Bloqueamos la cuenta
            bloquear.acquire()
            ope = Transaccion(self.saldo)
            # Lanzamos un hilo, con la operacion, sus parametros y el bloqueo
            agregarHistorial(' O ** Se lanza un hilo')
            thread.start_new_thread(ope.depositar,
                                    (parametros, token, bloquear))
            self.saldo = resultado.get()
            # Tiempo de espera para asegurar que entre el hilo
            time.sleep(3)
            # Liberamos el bloqueo
            agregarHistorial(' O ** Se libera el bloqueo')
            bloquear.release()
            # Se espera a que termine el hilo, para hacer la liberacion del bloqueo
            agregarHistorial(
                ' O ** Espera a termino del hilo y liberacion del bloqueo')
            bloquear.acquire()
            bloquear.release()
            self.bloqueado = False
            return self.saldo

        elif (operacion == 'retirar'):
            self.bloqueado = True
            self.verificador = True
            # Para solicitar un bloqueo si la cuenta se esta usando
            bloquear = thread.allocate_lock()
            agregarHistorial(' O ** Se bloquea la cuenta')
            # Bloqueamos la cuenta
            bloquear.acquire()
            ope = Transaccion(self.saldo)
            # Lanzamos un hilo, con la operacion, sus parametros y el bloqueo
            agregarHistorial(' O ** Se lanza un hilo')
            thread.start_new_thread(ope.retirar, (parametros, token, bloquear))
            # Tiempo de espera para asegurar que entre el hilo
            time.sleep(3)
            ret = resultado.get()
            # Se verifica si es posible realizar el retiro
            if (ret == -1):
                agregarHistorial(
                    ' O ** ABORTA TRANSACCION >> Saldo insuficiente ')
                self.bloqueado = False
                self.verificador = False
                # Liberamos el bloqueo
                agregarHistorial(' O ** Se libera el bloqueo principal')
                bloquear.release()
                # Se espera a que termine el hilo, para hacer la liberacion del bloqueo
                agregarHistorial(
                    ' O ** Espera a termino del hilo y liberacion del bloqueo')
                bloquear.acquire()
                bloquear.release()
                return self.abortaTransaccion(' Saldo insuficiente')
            else:
                self.bloqueado = False
                self.saldo = ret
                # Liberamos el bloqueo
                agregarHistorial(' O ** Se libera el bloqueo principal')
                bloquear.release()
                # Se espera a que termine el hilo, para hacer la liberacion del bloqueo
                agregarHistorial(
                    ' O ** Espera a termino del hilo y liberacion del bloqueo')
                bloquear.acquire()
                bloquear.release()
                return self.saldo

        elif (operacion == 'cerrarSesion'):
            agregarHistorial(' 0 ** Operacion cerrar sesion T >> ' +
                             str(impresion(token)))
            ope = Transaccion(self.saldo)
            nuevoSaldo = ope.consultar(token)
            return self.cerrarTransaccion(nuevoSaldo)
コード例 #13
0
 def abortaTransaccion(self, mensaje):
     agregarHistorial(' O ** ABORTAR TRANSACCION')
     self.bloqueado = False
     self.tokenActual = None
     return mensaje
コード例 #14
0
 def cerrarTransaccion(self, nuevoSaldo):
     agregarHistorial(' O ** CERRAR TRANSACCION')
     self.saldo = nuevoSaldo
     self.bloqueado = False
     self.tokenActual = None
     return self.saldo
コード例 #15
0
while True:
    conexion, direccionCliente = sock.accept()

    # Se reciben los datos
    datos = conexion.recv(4096)

    if datos:
        # Se formatean los datos para que sean enviados a JSON
        p = json.loads(datos.decode('utf-8'))

        # Se abre el socket para inicar la transacción y se
        # devuelve el token asignado al cliente que accedio
        # a la cuenta
        if (p['iniciar'] == True):
            agregarHistorial(' S ** Cliente ' + p.get('cliente') +
                             ' inicia sesion ')
            r = c.abrirTransaccion()
            agregarHistorial(' S ** Inicia transaccion datos ' + r)
            conexion.sendall(str(r).encode())
        # Se ejecuta el método hacer de la instancia de operación se
        # Se envia:
        #	- El token asignado al cliente al comenzar a operar sobre la cuenta
        #	  mas el token que se creo para la operación en ese momento
        #	- La operación que se desea realizar
        #	- Los parametros proporcionados por el cliente dependiendo de la
        #	  operación a realizar sobre la cuente
        # Se regresa:
        # 	- La respuesta de ejecutar la operación indicada sobre la cuenta
        elif (p.get('token')):
            # Se crea un token para la operacion
            transaccionToken = generarPassword(6)