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
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")
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
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)
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)
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
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
def token(self, token): agregarHistorial(' 0 ** Token actual ' + str(impresion(token))) return token
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
def depositar(self, monto, token, bloqueo): agregarHistorial(' O ** Operacion depositar T >> ' + str(impresion(token))) self.saldo = self.saldo + float(monto) resultado.put(self.saldo)
def consultar(self, token): agregarHistorial(' O ** Operacion consultar T >> ' + str(impresion(token))) return self.saldo
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)
def abortaTransaccion(self, mensaje): agregarHistorial(' O ** ABORTAR TRANSACCION') self.bloqueado = False self.tokenActual = None return mensaje
def cerrarTransaccion(self, nuevoSaldo): agregarHistorial(' O ** CERRAR TRANSACCION') self.saldo = nuevoSaldo self.bloqueado = False self.tokenActual = None return self.saldo
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)