# https://programmerclick.com/article/1178512005/ opcion para hacer concurrente # https://es.stackoverflow.com/questions/62936/crear-un-servidor-capaz-de-atender-multiples-clientes-en-python-3-6 # esta es otra opcion para hacerlo concurrente # esta parece ser la mejor opcion: # https://programmerclick.com/article/35802520251/ podemos probar select o epoll en vez de multihilo como lo de abajo # cambiar varias cosas en este pero se parece al servidor TCP de la tarea 3 import socket import select import sys # ------- buffer_num = "3.1415" # the number we are receiving from Medicion and sending to Lector # ------- def reusePort(s): # https://docs.python.org/es/3/library/socket.html#functions info de setsocketopt if(s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) == -1): print("error in setsockopt,SO_REUSEPORT") sys.exit(-1) return if(len(sys.argv) < 2): print("Debe ejecutarse como: python opc ") sys.exit(-1) port = int(sys.argv[1]) # creacion de socket TCP socket_TCP = socket.socket(socket.AF_INET, socket.SOCK_STREAM) reusePort(socket_TCP) if (socket_TCP.bind(('localhost', port)) == -1): socket_TCP.close() print("binding name to stream socket") sys.exit(-1) socket_TCP.listen(5) # creacion socket UDP socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) reusePort(socket_UDP) if (socket_UDP.bind(('localhost', port)) == -1): socket_UDP.close() print("binding name to stream socket") sys.exit(-1) # Crear una lista socket_lists = [socket_TCP, socket_UDP] # Espere a que la conexión del cliente isFinished = False while isFinished == False: try: # Sólo el estado de la lectura, el programa se bloquea en esta, no consume la CPU, si el valor en la lista cambia, entonces resolver el tapón read_lists, _, _ = select.select(socket_lists, [], [], 2) # revisar todos los socket que ubo movimiento de lectura for sock in read_lists: # revisar si es de tipo TCP if sock == socket_TCP: # Si encontramos un server tcp # Obtener una nueva conexión new_socket, client_info = sock.accept() print(f"cliente: {client_info} conectado") # Añadir a la lista de oyentes #socket_lists.append(new_socket) # receive the message, check if it's "n" rcv_msg = str(new_socket.recv(100), 'utf-8').strip() print(rcv_msg) if rcv_msg == "n": # si es n, enviamos print("es n") print(f"preparandose para enviar {buffer_num}") try: bufferNumTemp = buffer_num+r'\n' bytesBufferNum = str.encode(bufferNumTemp) new_socket.sendall(bytesBufferNum) except socket.error: print("sock.send err") new_socket.close() elif sock == socket_UDP: # Si es de tipo udp raw_data = sock.recv(1024) if raw_data: #si no recibe nada, esto quedaria en 0 y no entramos buffer_num = str(raw_data.decode('utf-8')).strip() print(f"medicion recibida OK: {buffer_num}") except KeyboardInterrupt: isFinished = True print("Closing properly...") socket_TCP.close() socket_UDP.close() print("Closed succesfully!...")