Python y Socket. Funciona en LAN y no en WAN
Publicado por RuDaHee (1 intervención) el 29/07/2019 20:12:31
Mi pregunta quizás sea una tontería, pero estoy empezando con socket, y no encuentro información :S
La aplicación es básicamente un chat, donde los mensajes se envían al servidor y este los reenvía a todos los usuarios que no son el emisor.
Este programa funciona estupendamente si como ip le pongo al cliente y al servidor "localhost". He abierto un No-ip(Cambien he probado con mi ip publica), los puertos en mi router, y desactivado el firewall en ambos ordenadores.
El/Los Cliente/s conectan al servidor, y puedo enviar un primer mensaje, que reciben todos los clientes. pero cuando envío mas mensajes, no ocurre nada, pero la conexión sigue viva entre los clientes y el servidor.
Gracias por su ayuda y sus respuestas de antemano.
SERVIDOR
CLIENTE
La aplicación es básicamente un chat, donde los mensajes se envían al servidor y este los reenvía a todos los usuarios que no son el emisor.
Este programa funciona estupendamente si como ip le pongo al cliente y al servidor "localhost". He abierto un No-ip(Cambien he probado con mi ip publica), los puertos en mi router, y desactivado el firewall en ambos ordenadores.
El/Los Cliente/s conectan al servidor, y puedo enviar un primer mensaje, que reciben todos los clientes. pero cuando envío mas mensajes, no ocurre nada, pero la conexión sigue viva entre los clientes y el servidor.
Gracias por su ayuda y sus respuestas de antemano.
SERVIDOR
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import socket
import threading
class ClaseServidor():
def __init__(self):
# Configuramos el tipo de conexion y nos ponemos a escuchar
self.servidor = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.servidor.bind(('', 1337))
self.servidor.listen()
self.servidor.setblocking(False) # No bloqueamos la conexion (Genera una excepcion si no puede mandar o recibir datos).
# Ponemos un thread a aceptar las conexiones.
aceptarConex = threading.Thread(target=self.AceptarConexiones)
aceptarConex.daemon = True
aceptarConex.start()
# Ponemos un thread a leer y reenviar los mensajes entrantes.
manejoMensajes = threading.Thread(target=self.ManejarMensajesEntrantes)
manejoMensajes.daemon = True
manejoMensajes.start()
# Bucle que mantiene vivo el servidor.
try:
while True:
Mensaje = input(" => ")
if Mensaje == "salir":
self.servidor.close()
break
except:
self.servidor.close()
def MandarMensajes(self, mensaje, emisor):
for receptor in self.listaConexiones:
try:
# Si la persona que envia el mensaje no es el que lo recibe, envia el mensaje.
if emisor != receptor:
receptor.send(mensaje)
except:
# Entramos en la excepcion si no se puede enviar el mensaje a alguien, y lo quitamos de la lista de clientes.
self.listaConexiones.remove(cliente)
def AceptarConexiones(self):
self.listaConexiones = [] # Lista para guardar las conexiones
while True: # Bucle que mantiene escuchando
try:
clienteConexion, clienteIP = self.servidor.accept() # Empezamos a aceptar conexiones
clienteConexion.setblocking(False)
self.listaConexiones.append(clienteConexion) # Agregamos el objeto cliente a nuestra lista.
print("se ha conectado el cliente: ", clienteIP[0])
except:
pass # Esto es para el setblocking, si se puede aceptar, da una excepcion.
def ManejarMensajesEntrantes(self):
while True: # Bucle que mantiene vivo el manejo de mensajes.
if len(self.listaConexiones) != 0:
for cliente in self.listaConexiones:
try:
mensaje = cliente.recv(2048) # Recibimos un mensaje.
self.MandarMensajes(mensaje, cliente) # Lo mandamos a enviar.
except:
pass # Esto es para el setblocking, si no recibe un mensaje, da una excepcion.
# --------------------------------------------------------------#
start = ClaseServidor()
CLIENTE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import socket
import threading
class ClaseCliente():
def __init__(self):
# Configuramos el tipo de conexion y nos conectamos al servidor.
self.cliente = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.cliente.connect(('mi.dominio.no-ip', 1337))
self.nick = input("Selecciona tu nombre de usuario: ")
# Ponemos un thread a recibir los mensajes.
mensajeRecibido = threading.Thread(target=self.RecibirMensajes)
mensajeRecibido.daemon = True
mensajeRecibido.start()
# Bucle que mantiene vivo el bucle y ademas nos permite enviar mensajes.
while True:
mensaje = input()
try:
if mensaje != "salir":
self.EnviarMensajes(mensaje)
else:
self.cliente.close()
except:
self.cliente.close()
def RecibirMensajes(self):
while True: # Bucle que mantiene viva la recepcion de mensajes.
try:
mensaje = self.cliente.recv(2048)
print(mensaje.decode()) # Por defecto el encode es "utf-8".
except:
pass
def EnviarMensajes(self, mensaje):
mensaje = self.nick + "- " + mensaje # Agregamos el nick al mensaje.
self.cliente.send(bytes(mensaje.encode())) # Enviamos el mensaje codificado al servidor. Por defecto, en "utf-8".
# --------------------------------------------------------------#
start = ClaseCliente()
Valora esta pregunta


0