es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for 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:

    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):
        # variable de bandera para controlar el segundo bucle while
        flag = True
        while True:
            cmd = input("Ingrese el comando de entrada:")
            # bucle for para enviar el mensaje a cada uno
            for i in range(0, numbOfConn):
                connectionList[i].sendto(str.encode(cmd), addressList[i])
            while flag:
                for i in range(0, numbOfConn):
                    response = connectionList[i].recv(2048)
                    print("respuesta")
                    if(response.decode('utf-8') == "done"):
                        print("Saliendo del bucle")
                        flag = False
                        break
            flag = True
    
    while True:
        # aceptar una conexión
        connection, address = sock.accept()
        print ('Conexión recibida de', address)
    
        numbOfConn += 1
        addressList.append((address))
        connectionList.append((connection))
    
        # Hilo que llama a la función: clients y los almacena en una tupla llamada connection
        start_new_thread(clients, (connectionList, addressList))
        ThreadCount += 1
        print('Número de hilo: ' + str(ThreadCount))
    
    sock.close()
    

    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.

Comments are closed.