Java - Crear socket de escucha en ip privada

 
Vista:
sin imagen de perfil
Val: 186
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Crear socket de escucha en ip privada

Publicado por Juan (70 intervenciones) el 25/06/2019 09:09:11
Hola muy buenas, tengo una consulta. estoy realizando un programa que solicitara la información a una api en php, la cual enviara en un json la información que necesito. el problema es que mi programa se conecta a internet mediante una linea telefónica que contiene una ip privada, entonces no puedo crear un socket de escucha para que la api me diga cuando se produce un cambio, pero tampoco quiero tener que estar solicitando la información cada pocos segundos para ver si se ha producido un cambio. he estado leyendo algo sobre crear una conexión VPN. y mi pregunta es si es posible a través de la VPN?, y si es posible a través de java crear esta VPN?, mi programa esta en java, y la api en php. puedo hacer modificaciones tanto en la api como en mi programa java. así que no hay problema si es necesario cambiar algo en la api. No necesito que me den códigos de como hacerlo, ya me encargo yo de eso. pero como no tengo mucha información sobre las vpn, si quisiera que me orientaran un poco y simplemente decirme si es posible o no. muchas gracias.
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

Crear socket de escucha en ip privada

Publicado por Tom (1831 intervenciones) el 25/06/2019 09:57:33
Yo no consigo entender ni tu problema ni lo que quieres hacer.
De cualquier modo ¿ puedes ampliar eso de que "entonces no puedo crear un socket de escucha" ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 186
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Crear socket de escucha en ip privada

Publicado por Juan (70 intervenciones) el 25/06/2019 11:03:24
Hola tom gracias por responder.

Con "socket de escucha" me refiero a que mi programa se quede a la espera de que alguien se conecte y le envié un mensaje. es decir que mi programa haga la función de servidor, que este a la espera de que un cliente se conecte a el.

problema: Tengo dirección ip privada, no es visible en internet, necesito una ip publica para poder ser visible en internet y poder crear este servidor en espera de una conexión...

especifico un poco mas, en el proyecto que estoy realizando intervienen 2 programas que se comunican a través de una API(Hecha en php, que es la que modifica la base de datos). llamaremos a uno de los programas interfaz (es donde el cliente hace los cambios, y modifica los datos) esta interfaz manda los datos a la api para actualizarlos. hay un segundo programa lo llamaremos "Ejecutor" el cual se encarga de realizar las acciones dependiendo de los datos que hay. el problema lo tengo en el "Ejecutor", ya que este es quien tiene la ip privada. lo que quiero hacer es crear un servidor en "ejecutor". de manera que el cliente hace cambios en "Interfaz", interfaz manda los datos a la API, y que la API avise a "ejecutor" que hubo un cambio y le mande los nuevos datos y "ejecutor" realice lo que debe hacer. para que esta API avise a "ejecutor" del cambio, debe haber un servidor en espera al que la API se pueda conectar.

Para crear este servidor necesito una ip publica, asi que no puedo hacerlo, porque tengo una ip privada. y tampoco quiero que "ejecutor" se este conectando cada pocos segundos a la API para verificar si hay cambios.

Leyendo por internet, consegui algo sobre establecer una VPN (Red privada virtual). y la solucion que pense es que "ejecutor" se conecte a la API y se cree un vpn entre estos dos, de manera que ya se puedan comunicar entre ellos sin necesidad de este servidor. es como crear un puente entre la api y "ejecutor" para enviar y recibir datos. de esta manera la api ya podría avisar que se ha producido un cambio.

No se nada de esto de VPN, lo que explico es lo que he entendido al leer por internet.

Mi pregunta es:


Es posible hacer esta comunicación entre la API y "ejecutor" a través de vpn? o es algo muy complicado?
Hay otra manera de hacerlo? a traves de websockets (https://carlosazaustre.es/websockets-como-utilizar-socket-io-en-tu-aplicacion-web/), o un túnel SSH.

y cual de estas es compatible con J2ME.

Otra cosa a destacar, es que pueden haber varios programas "ejecutores" que intenten conectarse al servidor. que tendrán un numero identificativo. es posible crear una VPN con cada "ejecutor" que se conecte? no serán un numero exagerado. como mucho mucho exagerando 100.

---------

No se si explico mi duda, quiero que "ejecutor" pueda recibir mensajes de la API cuando se modifiquen los datos, sin que "ejecutor" tenga un servidor a la espera de una conexión, porque esa solución no puede ser debido a su ip privada.

Todo esto pensando en que "ejecutor" esta escrito en J2ME. es decir una solución compatible, a lo mejor lo de VPN si sirve pero con J2ME no es compatible. Quiero ver si alguien me puede orientar un poco en esto, si sabe. y muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Crear socket de escucha en ip privada

Publicado por Tom (1831 intervenciones) el 25/06/2019 11:38:53
Es que te estás liando bastante. Para usar una vpn no usas magia negra, usas sockets. Si no puedes abrir sockets, apaga y vámonos, ni hay vpn ni nada.
Entonces, por lo que cuentas, ahora mismo tu cliente y tu server (el "ejecutor") se "ven" a través de una ip, da igual que sea pública o privada.
No deberías tener ningún problema en lanzar un nuevo servicio en tu server escuchando en algún port de su ip a no ser que haya un firewall entre medias que solamente permita el uso de determinados ports.
Si hay un firewall, solamente tienes que habilitar un nuevo port.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 186
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Crear socket de escucha en ip privada

Publicado por Juan (70 intervenciones) el 25/06/2019 12:14:28
gracias nuevamente tom por tu interés en ayudarme.

El servidor en escucha si lo puedo lanzar aun teniendo la ip privada. pero este servidor no es posible localizarlo para la API. ya que al ser ip privada no esta visible en internet a través de esa ip. la API nunca encontrara este servidor. y por tanto nunca se conectaran.

Es como una red en tu casa. tu ordenador tiene una ip privada = 192.168.1.1 que le da tu router. si montas un servidor con esa ip, no podrás acceder a ella a través de internet. porque hay miles y miles de ordenadores con esa ip, y no se conectan a internet a través de esa ip, se conectan a través de la ip publica. que a lo mejor es 77.200.56.34 (me la invente). si quieres que tu ordenador tenga un servidor visible en internet debes montar el servidor con 77.200.56.34, en el puerto 8080 por ejemplo. y configurar tu router para que cuando se conecte alguien a ese puerto, re-direccione el mensaje a la ip privada 192.168.1.1 que es la de tu ordenador, donde estará el programa con el socket de escucha en el puerto 8080. algo así jeje, no entrare en mucho detalle con eso.

entonces:

En este caso no sirve montar el servidor con la ip privada, porque mi aplicación(ejecutor) no se conecta a internet con su ip privada, se conecta con su ip publica, proporcionada por movistar. para que la api reconozca este servidor de ip privada, este debería conectarse a la ip publica y puerto de movistar, y movistar debe configurar una re-dirección a la ip privada y puerto que tiene mi aplicación (ejecutor), lo cual no va a pasar. movistar no va a configurar nada lo que es lógico y entendible.

La API si tiene su ip publica, y puede establecer conexión a internet con una ip que si conozco. por lo tanto mi app(ejecutor) si logra detectarla y conectarse a ella, si creo una vpn en la API, y me conecto a través de esa VPN, estaría simulando una red local, entre la API y mi app(ejecutor). por lo que se podrían intercambiar información entre ellos, como si se tratara que ambos estuvieran conectados por un cable en tu casa.

por lo que he entendido, de la vpn, es decirle a mi API conectate a esta ip: 10.10.10.10 y abre el puerto 8080, luego mi app (ejecutor) se conecta a la misma VPN, se conecta a internet a través de la ip 10.10.10.10 en lugar de la que le proporciona movistar, y se conecta al puerto 3030, por lo que la API manda un mensaje en el puerto 3030 y lo recibe mi app(ejecutor) que esta conectado a la misma ip en ese puerto. como si ambos estuvieran conectados al mismo router (evidentemente tendré que poner un método de identificación) antes de trasmitir datos.

no se si funcione así lo de la VPN o lo estoy entendiendo mal, y no se si es posible hacer esto a taves de java. o si existe otro método.

(repito que no se nada, todo lo que se, es lo que entiendo al investigar en internet, no lo he probado).

lo del servidor si tengo claro que no puedo hacerlo, lo que quiero saber es una solución para establecer esta comunicación.

que imagino que si existe una manera de hacerlo, la cosa es que no se como, y no se si esto que digo con la VPN pueda funcionar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 186
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Crear socket de escucha en ip privada

Publicado por Juan (70 intervenciones) el 25/06/2019 12:43:46
A lo mejor si me estoy complicando como tu dices, y simplemente tengo que establecer la comunicación y quedarme en espera. es decir:

que mi API tenga un servidor a la espera. mi app(ejecutor) se conecte, envié un mensaje para identificarse y se quede a la espera de un mensaje de vuelta. y que la API no responda hasta que se produzca un cambio. luego si se produce un cambio y responde, cargo los datos y me vuelvo a conectar, mandar el mensaje de identificación y volverme a quedar a la espera.

No se si esto genere algún tipo de error... o exista un limite de tiempo para esperar la respuesta del servidor... o si esto genere un trafico elevado, al ser 100 app(ejecutor) que estarían a la espera del mensaje del servidor. o si no sea muy eficaz, si se pueda sobrecargar la memoria ram (que no cuento con mucha, estoy en J2ME), de este modo. no se, esto se me acaba de ocurrir por tu mensaje (No se si te referías a esto) y no se si sea bueno jeje.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Crear socket de escucha en ip privada

Publicado por Tom (1831 intervenciones) el 25/06/2019 13:05:50
Pensé que ya tenías algo funcionando y querías añadir más funcionalidad.

Es más o menos como dices, salvo que no es necesario que reconfigures tu IP privada.
Es decir, el PC de mi casa tiene una Ip privada, y tengo un servicio arrancado, el de ssh que funciona bien para la red local (otros PCs conectados al mismo router).
En el router habilito el puerto 22 para conexiones entrantes y le digo que quien atiende ese puerto es la ip privada de mi pc. Ya está, tengo un servicio accesibe en mi PC a través de su IP pública.

Para esto deberías hablar con Movistar. Si no puede ser tendrás que hacerlo al revés, tu PC se conectará al otro en el que tengas levantado el interface de usuario, y aquí sí podrías usar si quieres VPN (necesitas un servidor vpn que admita conexiones entrantes, claro).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 186
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Crear socket de escucha en ip privada

Publicado por Juan (70 intervenciones) el 25/06/2019 13:32:08
Vale gracias tom.

la app (ejecutor) no se corre en un ordenador. si no en un arduino o dispositivo parecido, seria un M2M. que se conecta desde una tarjeta telefónica M2M a la red movistar. y como dije antes, podrían ser hasta 100 dispositivos M2M que quieran hacer esta comunicación con el servidor (API)

No creo que movistar acceda a redireccionar un puerto a mi ip privada, pero tampoco he preguntado porque lo veo difícil al ser 100 dispositivos (máximo). porque tendría que abrir 100 puertos y redireccionarlo a las 100 ip privada, y no conectaría todos a la vez, y si cada vez que añada uno tengo que llamar a movistar para que me abra un puerto, tarde o temprano me mandaran a la mi..... jejeje. así que no he intentado llamar a movistar, seria mi ultimo recurso.

lo que comento anteriormente es posible? de enviar el mensaje al servidor y esperar respuesta y no responder hasta que se produzca el cambio.

outputStream.write("Identificación al servidor: hola soy el dispositivo 1056, envíame los cambios");
respuesta = inputStream.read();

se que el código no es así, pero es para que nos entendamos jeje, el m2m (ejecutor) se queda en esa linea hasta que responda el servidor, este responde 3 días después y es cuando el m2m obtiene los datos, los actualiza y vuelve a repetir ese código. es posible?

o la mejor solución es a través de la vpn?

o me dejo de tonterías, y hago los M2M que soliciten la información cada minuto y ya esta jejeje.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Crear socket de escucha en ip privada

Publicado por Tom (1831 intervenciones) el 25/06/2019 14:53:27
No necesitarías 100 puertos, solamente uno.
A ver, esto lo deberías haber aclarado antes:
Cada arduino es un cliente. Tiene conexión a Internet y a tu server (olvídate de APIs). ¿ Correcto ?

Entonces sí, lo que debes hacer es que cada arduino se conecte al server y se identifique.
En el server pondrás un único socket tcp/ip a aceptar conexiones por un único puerto. Este sería el que debes habilitar en el router del server si no lo está ya, y en cualquier posible firewall que hubiera.

Una vez que tienes un arduino conectado al servidor, ya tienes un canal de comunicación por el que leer y escribir. Pones al arduino a leer todo el rato y ya está.
El el server, lo mismo, tendrás un socket abierto y conectado por cada arduino. Cuando el server tenga datos nuevos se los envía a los clientes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 186
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Crear socket de escucha en ip privada

Publicado por Juan (70 intervenciones) el 26/06/2019 08:11:46
ah vale, entonces si me estaba complicando jeje.

muchas gracias tom
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar