Python Socket conexión de diferentes dispositivos no funciona

He creado una pequeña aplicación de chat en un servidor local con python. Cuando ejecuto el código del cliente en mi propio ordenador funciona bien, pero cuando lo probé en otro dispositivo dice: [WinError 10061] no se puede hacer ninguna conexión porque el ordenador objetivo activly lo rechazó. Traté de poner el host a “”, intenté abrir el puerto pero ambos no funcionaron. ¿Qué debo hacer? Por favor, no vengas con respuestas como “probablemente con tu cortafuegos” porque ya lo sé. Quiero saber exactamente paso a paso qué hacer para que funcione en realidad

mi script servidor:

import threading
import socket

name=socket.gethostname()
host=socket.gethostbyname(name)
port=5050

server=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((host, port))
server.listen()

clients=[]
nicknames=[]

def broadcast(message):
    for client in clients:
        client.send(message)

def handle(client):
    while True:
        try:
            message=client.recv(1024)
            broadcast(message)
        except:
            index=clients.index(client)
            clients.remove(client)
            client.close()
            nickname=nicknames[index]
            broadcast(f"{nickname} left the chat".encode("ascii"))
            nicknames.remove(nickname)
            break

def recieve():
    while True:
        client,address=server.accept()
        print(f"[NEW CONNECTION] {str(address)} connected with the server!")
        
        client.send("NICK".encode("ascii"))
        nickname=client.recv(1024).decode("ascii")
        
        nicknames.append(nickname)
        clients.append(client)

        client.send("Welcome! you are connected to the server! have fun chatting!".encode("ascii"))        
        broadcast(f"{nickname} joined the chat!".encode("ascii"))

        thread=threading.Thread(target=handle, args=(client,))
        thread.start()

print("[LISTENING] server is started and is listening...")
recieve()

mi cliente script:


import threading
import socket

print("choose a nickname")
nickname=input()

host=socket.gethostbyname(socket.gethostname())
port=5050

client=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((host, port))

def recieve():
    while True:
        try:
            message=client.recv(1024).decode()
            if message=="NICK":
                client.send(nickname.encode("ascii"))
            else:
                print(message)
        except:
            print("an error occurred")
            client.close()
            break

def write():
    while True:
        message="{}: {}".format(nickname, input(""))
        client.send(message.encode("ascii"))

recieve_thread=threading.Thread(target=recieve)
recieve_thread.start()

write_thread=threading.Thread(target=write)
write_thread.start()


Pregunta hecha hace 3 años, 4 meses, 29 días - Por techmaestro


3 Respuestas:

  • cuando lo probé en otro dispositivo dice: [WinError 10061] no se puede hacer ninguna conexión

    ¿Qué es exactamente este otro dispositivo? ¿Y dónde está? ¿Y a dónde abres la toma?

    Supongo que estás tratando de abrir un socket a un servidor, y en ese caso, tienes que ejecutar el servidor primero antes de que tu cliente de socket, antes de ejecutar tu programa de socket, si no vas a conseguir un no connection error.

    Respondida el Dec 18, 2020 a las 16:50 - por codeglitch

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando es probablemente debido a la configuración de red en el dispositivo al que estás tratando de conectarte. Aquí hay algunos pasos que puedes seguir para intentar solucionar el problema:

    • Verifica la Configuración de Red del Dispositivo:
    - Asegúrate de que el dispositivo al que estás tratando de conectarte esté en la misma red local que el servidor. Si están en diferentes redes, es posible que necesites configurar enrutamiento para permitir la comunicación entre ellas.
    • Comprueba que el firewall del dispositivo no esté bloqueando la conexión. Puedes intentar desactivar temporalmente el firewall para ver si eso resuelve el problema.

    • Configura la Dirección IP del Servidor Manualmente:
    - En lugar de usar socket.gethostbyname(socket.gethostname()), intenta configurar directamente la dirección IP del servidor en el cliente. Puedes obtener la dirección IP del servidor ejecutando ipconfig en la línea de comandos y buscando la dirección IPv4 de la interfaz que está en la misma red que el cliente.

    • Use la Dirección IP Local:
    - En el cliente, intenta utilizando la dirección IP local del servidor en lugar de la dirección IP pública. Puedes obtener la dirección IP local del servidor ejecutando ipconfig en la línea de comandos y buscando la dirección IPv4 de la interfaz que está en la misma red que el cliente.

    Intenta estos pasos y verifica si logras establecer la conexión entre el cliente y el servidor en diferentes dispositivos. Si el problema persiste, puede ser útil revisar la configuración de red de los dispositivos y asegurarte de que no haya otras restricciones de red que estén interfiriendo con la conexión.

    Respondida el Dec 19, 2020 a las 16:51 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Paso 1: Verifica la dirección IP del host

    Asegúrate de que la dirección IP del host (variable host en tu código) sea correcta. Puede obtener la dirección IP del host ejecutando ipconfig en Windows o ifconfig en macOS/Linux.

    Paso 2: Verifica el cortafuegos

    Aunque hayas verificado que el cortafuegos no está bloqueando tu aplicación, puede haber otras configuraciones de seguridad o software antivirus que puedan estar interfiriendo. Intenta desactivar temporalmente estos programas y vuelve a intentar la conexión.

    Paso 3: Ejecuta el servidor y el cliente en el mismo dispositivo

    Para descartar cualquier problema relacionado con la red, intenta ejecutar tanto el servidor como el cliente en el mismo dispositivo. Si la conexión funciona correctamente en este escenario, indica que el problema está relacionado con la comunicación entre dispositivos.

    Paso 4: Verifica la configuración del enrutador

    Asegúrate de que tu enrutador esté configurado para permitir conexiones entrantes en el puerto 5050 (el puerto que estás utilizando para la comunicación). Es posible que necesites configurar el reenvío de puertos o la DMZ en tu enrutador.

    Paso 5: Intenta usar una dirección IP local

    En lugar de usar la dirección IP externa del host, intenta usar su dirección IP local. La dirección IP local generalmente comienza con "192.168." o "10.0." Esto ayudará a descartar cualquier problema relacionado con la configuración del enrutador o la red externa.

    Paso 6: Comprueba la conectividad de red

    Asegúrate de que ambos dispositivos tengan una conexión de red estable. Intenta pingar el host (dirección IP) desde el dispositivo del cliente y viceversa para verificar la conectividad.

    Paso 7: Depura tu código

    Agrega registros de depuración a tu código para rastrear el progreso de la conexión. Esto te ayudará a identificar cualquier problema potencial con el proceso de conexión.

    Consejos adicionales:

    Utiliza una biblioteca de socket de terceros, como PyQtSocket o Twisted, para simplificar el manejo de la comunicación de red. Si todo lo demás falla, considera utilizar una herramienta de monitoreo de red como Wireshark para capturar y analizar el tráfico de red. Esto puede revelar cualquier discrepancia o problema de configuración.

    Respondida el Dec 19, 2020 a las 16:54 - por Gemini

    Votos positivos: 0 | Votos negativos: 0