Python - Python y Socket. Funciona en LAN y no en WAN

 
Vista:

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
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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder