From 32655b8c32c183a4a58f9ca652e9aa5a46ab3534 Mon Sep 17 00:00:00 2001 From: vicsash Date: Fri, 16 Feb 2024 10:49:32 +0100 Subject: [PATCH] Intentando limitar el numero de cliente que pueden usar el servidor --- Cliente.py | 21 +++++++++------ Cliente2.py | 21 +++++++++------ Cliente3.py | 21 +++++++++------ Cliente4.py | 21 +++++++++------ ServidorCajero.py | 67 +++++++++++++++++++++++++++-------------------- 5 files changed, 90 insertions(+), 61 deletions(-) diff --git a/Cliente.py b/Cliente.py index 846f0f6..8714ded 100644 --- a/Cliente.py +++ b/Cliente.py @@ -14,7 +14,7 @@ def get_ip_address(): return IP HOST = get_ip_address() -PORT = 2005 +PORT = 2002 while True: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: @@ -22,22 +22,27 @@ while True: try: s.connect(server_address) except ConnectionRefusedError: - print("Connection refused, try again later.") - sys.exit() # Terminate the program - # Send a message immediately after connecting + print("Conexión rechazada, intente más tarde.") + sys.exit() message = "Conectando!" print('{!r}'.format(message)) s.sendall(message.encode('utf-8')) - print('Esperando la respuesta') - while True: # Keep the connection open until the user enters a command + data = s.recv(1024) + print("Received data from server: " + data.decode('utf-8')) + if data.decode('utf-8') == "Maximo numero de conexiones alcanzado. Por favor intente mas tarde.": + print("Conexiones máximas alcanzadas. Por favor intente más tarde.") + sys.exit() + while True: command = input("Entra comando (retirar o 'exit' para salir): ") if command.lower() == 'exit': + s.sendall(command.encode('utf-8')) + time.sleep(1) break elif command.lower() == 'retirar': amount = input("Entera la cantidad de dinero: ") message = f"{command} {amount}" else: print("Comando no reconocido") - message = command # Send the unrecognized command to the server + message = command s.sendall(message.encode('utf-8')) - + break diff --git a/Cliente2.py b/Cliente2.py index 846f0f6..8714ded 100644 --- a/Cliente2.py +++ b/Cliente2.py @@ -14,7 +14,7 @@ def get_ip_address(): return IP HOST = get_ip_address() -PORT = 2005 +PORT = 2002 while True: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: @@ -22,22 +22,27 @@ while True: try: s.connect(server_address) except ConnectionRefusedError: - print("Connection refused, try again later.") - sys.exit() # Terminate the program - # Send a message immediately after connecting + print("Conexión rechazada, intente más tarde.") + sys.exit() message = "Conectando!" print('{!r}'.format(message)) s.sendall(message.encode('utf-8')) - print('Esperando la respuesta') - while True: # Keep the connection open until the user enters a command + data = s.recv(1024) + print("Received data from server: " + data.decode('utf-8')) + if data.decode('utf-8') == "Maximo numero de conexiones alcanzado. Por favor intente mas tarde.": + print("Conexiones máximas alcanzadas. Por favor intente más tarde.") + sys.exit() + while True: command = input("Entra comando (retirar o 'exit' para salir): ") if command.lower() == 'exit': + s.sendall(command.encode('utf-8')) + time.sleep(1) break elif command.lower() == 'retirar': amount = input("Entera la cantidad de dinero: ") message = f"{command} {amount}" else: print("Comando no reconocido") - message = command # Send the unrecognized command to the server + message = command s.sendall(message.encode('utf-8')) - + break diff --git a/Cliente3.py b/Cliente3.py index 846f0f6..8714ded 100644 --- a/Cliente3.py +++ b/Cliente3.py @@ -14,7 +14,7 @@ def get_ip_address(): return IP HOST = get_ip_address() -PORT = 2005 +PORT = 2002 while True: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: @@ -22,22 +22,27 @@ while True: try: s.connect(server_address) except ConnectionRefusedError: - print("Connection refused, try again later.") - sys.exit() # Terminate the program - # Send a message immediately after connecting + print("Conexión rechazada, intente más tarde.") + sys.exit() message = "Conectando!" print('{!r}'.format(message)) s.sendall(message.encode('utf-8')) - print('Esperando la respuesta') - while True: # Keep the connection open until the user enters a command + data = s.recv(1024) + print("Received data from server: " + data.decode('utf-8')) + if data.decode('utf-8') == "Maximo numero de conexiones alcanzado. Por favor intente mas tarde.": + print("Conexiones máximas alcanzadas. Por favor intente más tarde.") + sys.exit() + while True: command = input("Entra comando (retirar o 'exit' para salir): ") if command.lower() == 'exit': + s.sendall(command.encode('utf-8')) + time.sleep(1) break elif command.lower() == 'retirar': amount = input("Entera la cantidad de dinero: ") message = f"{command} {amount}" else: print("Comando no reconocido") - message = command # Send the unrecognized command to the server + message = command s.sendall(message.encode('utf-8')) - + break diff --git a/Cliente4.py b/Cliente4.py index 846f0f6..8714ded 100644 --- a/Cliente4.py +++ b/Cliente4.py @@ -14,7 +14,7 @@ def get_ip_address(): return IP HOST = get_ip_address() -PORT = 2005 +PORT = 2002 while True: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: @@ -22,22 +22,27 @@ while True: try: s.connect(server_address) except ConnectionRefusedError: - print("Connection refused, try again later.") - sys.exit() # Terminate the program - # Send a message immediately after connecting + print("Conexión rechazada, intente más tarde.") + sys.exit() message = "Conectando!" print('{!r}'.format(message)) s.sendall(message.encode('utf-8')) - print('Esperando la respuesta') - while True: # Keep the connection open until the user enters a command + data = s.recv(1024) + print("Received data from server: " + data.decode('utf-8')) + if data.decode('utf-8') == "Maximo numero de conexiones alcanzado. Por favor intente mas tarde.": + print("Conexiones máximas alcanzadas. Por favor intente más tarde.") + sys.exit() + while True: command = input("Entra comando (retirar o 'exit' para salir): ") if command.lower() == 'exit': + s.sendall(command.encode('utf-8')) + time.sleep(1) break elif command.lower() == 'retirar': amount = input("Entera la cantidad de dinero: ") message = f"{command} {amount}" else: print("Comando no reconocido") - message = command # Send the unrecognized command to the server + message = command s.sendall(message.encode('utf-8')) - + break diff --git a/ServidorCajero.py b/ServidorCajero.py index dafd892..ae86058 100644 --- a/ServidorCajero.py +++ b/ServidorCajero.py @@ -1,8 +1,9 @@ import socket +import sys import threading HOST = '' -PORT = 2005 +PORT = 2002 MAX_CONNECTIONS = 3 MAX_DINERO = 120000 connections = 0 @@ -11,21 +12,29 @@ max_connections_reached = False # Add a flag for max connections reached def handle_client(client_socket, addr): global connections global MAX_DINERO - global max_connections_reached # Access the global flag print(f"cliente conectado {addr})") connections += 1 - if connections < MAX_CONNECTIONS: - max_connections_reached = False # Reset the flag when connections drop below max + if connections > MAX_CONNECTIONS: + response = "Maximo numero de conexiones alcanzado. Por favor intente mas tarde." + client_socket.sendall(response.encode('utf-8')) + client_socket.close() + return print(f"Conexiones activas: {connections}") - client_socket.settimeout(60) # Set a timeout of 60 seconds - while True: - try: - datos = client_socket.recv(1024) + try: + while True: + try: + datos = client_socket.recv(1024) + except ConnectionResetError: + print("Connection was closed by the client.") + break if not datos: print("No data received from client. Closing connection.") - break # Close the connection when no data is received + break decoded_data = datos.decode('utf-8') - if ' ' in decoded_data: + if decoded_data.lower() == 'conectando!': + response = "Connection successful!" + client_socket.sendall(response.encode('utf-8')) + elif ' ' in decoded_data: command, amount = decoded_data.split() amount = int(amount) if command.lower() == 'retirar': @@ -37,25 +46,25 @@ def handle_client(client_socket, addr): else: response = "Saldo insuficiente por favor intente mas tarde." client_socket.sendall(response.encode('utf-8')) + elif command.lower() == 'exit': + break else: print(f"Received unexpected data: {decoded_data}") - except socket.timeout: - print("Client did not send data within the timeout period.") - connections -= 1 - print(f"Conexiones activas: {connections}") - client_socket.close() + except socket.timeout: + print("Client did not send data within the timeout period.") + finally: + connections -= 1 + print(f"Conexiones activas: {connections}") + client_socket.close() + +while True: + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + server_address = (HOST, PORT) + s.bind(server_address) + s.listen(MAX_CONNECTIONS) + while True: + if connections < MAX_CONNECTIONS: + client_socket, addr = s.accept() + client_thread = threading.Thread(target=handle_client, args=(client_socket, addr)) + client_thread.start() -with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: - s_addr = (HOST, PORT) - s.bind(s_addr) - s.listen(MAX_CONNECTIONS) - while True: - if connections >= MAX_CONNECTIONS: - if not max_connections_reached: # Only print the message if the flag is False - print('Maximo de conexiones alcanzado, esperando a que se libere una conexion.') - max_connections_reached = True # Set the flag to True after printing the message - continue - client_socket, addr = s.accept() - client_thread = threading.Thread(target=handle_client, args=(client_socket, addr)) - client_thread.daemon = True - client_thread.start() \ No newline at end of file