enviando el mensaje a varios clientes y recibiendo el mensaje de varios clientes
Estoy tratando de enviar el comando desde el servidor a los clientes conectados y tratar de recibir la respuesta.
Pero connectionList[i].recv(2048)
está interrumpiendo el bucle while. Quiero que el servidor solicite “Ingrese el comando” repetidamente, pero el bucle no se repite una vez que recibe la respuesta de los clientes.
Aquí está mi código
import socket
import sys
from _thread import *
import threading
# Crear un socket TCP/IP
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Vincular el socket al puerto
host = socket.gethostname()
server_address = ("0.0.0.0", 8765)
sock.bind(server_address)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# Escuchar conexiones entrantes
sock.listen(5)
print("Esperando conexión...")
# Variable para el número de conexiones
numbOfConn = 0
ThreadCount = 0
# Nombre de la lista utilizada para las conexiones
addressList = []
connectionList = []
# Función que busca continuamente conexiones
def clients(connectionList, addressList):
while True:
cmd=input("Ingrese el comando:")
# Bucle for para enviar el mensaje a cada uno
for i in range(0,numbOfConn):
connectionList[i].sendto(str.encode(cmd), addressList[i])
while True:
for i in range(0,numbOfConn):
response = connectionList[i].recv(2048)
# break
print("respuesta")
if(response.decode('utf-8') =="done"):
print("Salir del bucle")
break
# connection.close()
while True:
# aceptar una conexión
connection, address = sock.accept()
print('Se ha establecido una conexión desde', address)
numbOfConn += 1
addressList.append((address))
connectionList.append((connection))
# Hilo que llama a la función: clients y las almacena en una tupla llamada connection
start_new_thread(clients, (connectionList, addressList))
ThreadCount += 1
print('Número de hilo:', str(ThreadCount))
sock.close()
¿Podría ayudarme a encontrar el problema?
davy.ai
El problema es que el código se queda atrapado en el segundo bucle while, esperando la respuesta del cliente. Una vez que recibe la respuesta, sale del bucle y no repite el primer bucle while, donde solicita el comando nuevamente.
Una solución a este problema es utilizar una variable de bandera que controle el segundo bucle while. Una vez que se recibe la respuesta, la bandera se establece en Falso, lo que rompe el bucle y vuelve al primer bucle while donde se solicita el comando nuevamente.
Aquí hay una versión actualizada del código con una variable de bandera:
En este código actualizado, la variable de bandera se establece en Verdadero al principio de la función. Una vez que se envía el comando a los clientes, comienza el segundo bucle while. Cuando se recibe la respuesta de un cliente y es igual a “done”, la bandera se establece en Falso, lo que rompe el segundo bucle while. Luego, la bandera se restablece en Verdadero para repetir el segundo bucle while la próxima vez que se envíe el comando a los clientes.