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.

Tanto el cliente como el servidor trabajan en un mismo archivo.

Entonces tengo un programa que utiliza sockets, solo acepta conexiones, el archivo server.py escucha a un archivo client.py, pero ¿qué pasa si quiero que ambos archivos puedan escuchar y conectarse?

Por ejemplo, aquí está mi server.py:

def main():
print(“[INICIANDO] El servidor está iniciando…”)
“””Iniciando un socket TCP”””
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server.bind(ADDR)

server.listen()
print("[ESCUCHANDO] El servidor está escuchando...")


while True:
    """Aceptar la conexión del cliente"""
    conn, addr = server.accept()
    addr = socket.gethostname()
    print(f"[NUEVA CONEXIÓN] {addr} conectado.")

y este es mi client.py:

def main():
“””Iniciando un socket TCP.”””
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
while True:
“””Conectando al servidor.”””
client.connect(ADDR)

¿Cómo puedo hacer para que ambos estén en un solo archivo llamado “Server-Client.py”?
Así, si quiero utilizar Server-Client.py como cliente en una computadora, puedo usarlo como cliente,
y si quiero utilizar Server-Client.py como servidor en otra computadora, puedo usarlo como servidor y viceversa.

¿Alguna idea?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para convertir ambos archivos en un solo programa que pueda funcionar como servidor y cliente, deberás utilizar el multihilo. Esto significa que el programa deberá ejecutar dos hilos al mismo tiempo, uno para el cliente y otro para el servidor.

    Aquí te mostramos cómo puedes modificar tu código para lograr esto:

    import socket
    import threading
    
    # Establece la IP y el puerto para que el socket escuche
    HOST = '0.0.0.0'
    PORT = 5555
    ADDR = (HOST, PORT)
    
    def handle_client(conn, addr):
        print(f"[NUEVA CONEXIÓN] {addr} conectado.")
        while True:
            # Recibe datos del cliente
            data = conn.recv(1024)
            if not data:
                break
            # Imprime los datos recibidos
            print(f"[{addr}] {data.decode()}")
    
        # Cierra la conexión
        conn.close()
    
    def start_server():
        """Inicia el servidor para escuchar las conexiones entrantes"""
        # Crea un socket TCP
        server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
        # Asocia el socket a la dirección
        server.bind(ADDR)
    
        # Escucha las conexiones entrantes
        server.listen()
    
        # Imprime un mensaje indicando que el servidor está escuchando
        print(f"[ESCUCHANDO] El servidor está escuchando en {HOST}:{PORT}")
    
        while True:
            # Acepta las conexiones entrantes
            conn, addr = server.accept()
    
            # Crea un nuevo hilo para manejar la conexión entrante
            thread = threading.Thread(target=handle_client, args=(conn, addr))
            thread.start()
    
    def start_client():
        """Inicia el cliente para conectarse al servidor"""
        # Crea un socket TCP
        client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
        # Conéctate al servidor
        client.connect(ADDR)
    
        # Imprime un mensaje indicando que el cliente está conectado al servidor
        print(f"[CONEXIÓN ESTABLECIDA] El cliente está conectado a {HOST}:{PORT}")
    
        while True:
            # Obtiene la entrada del usuario
            message = input("Ingresa un mensaje: ")
    
            # Envía el mensaje al servidor
            client.send(message.encode())
    
    def main():
        # Solicita al usuario que elija entre ejecutar como servidor o cliente
        mode = input("Ingresa el modo (servidor/cliente): ")
    
        # Inicia el servidor o cliente según la entrada del usuario
        if mode == "servidor":
            start_server()
        elif mode == "cliente":
            start_client()
        else:
            print("Modo inválido, por favor ingresa 'servidor' o 'cliente'")
    
    

    En este código modificado, la función handle_client se utiliza para manejar las conexiones entrantes de los clientes. La función start_server configura un socket TCP para escuchar conexiones entrantes y crea un nuevo hilo para cada conexión entrante para manejarla por separado utilizando la función handle_client.

    La función start_client configura un socket TCP y se conecta al servidor. Luego, envía mensajes al servidor utilizando el método send.

    La función main solicita al usuario que elija entre ejecutarse como servidor o cliente, y comienza la función correspondiente según la entrada del usuario.

    Con este código modificado, puedes ejecutar el programa en una computadora como servidor y en otra computadora como cliente, o ejecutar el programa en una computadora y conectarte a ella como cliente utilizando el mismo programa.

Comments are closed.