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, 5 meses, 5 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:
- 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:
socket.gethostbyname(socket.gethostname())
, intenta configurar directamente la dirección IP del servidor en el cliente. Puedes obtener la dirección IP del servidor ejecutandoipconfig
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:
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 ejecutandoipconfig
en Windows oifconfig
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
oTwisted
, 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