Android: NAT Traversal?

Me parece que los dispositivos Android más recientes funcionan detrás de un NAT, donde la dirección local es una portadora interna o una dirección LAN y la dirección pública es el enrutador o portador asignado dirección externa.

Sin embargo, los teléfonos más nuevos no devuelven la misma dirección utilizando NetworkInterface como cuando acceden a un servicio de detección de IP.

Por lo tanto, la conexión a través de P2P SocketChannels directamente falla.

¿Hay soluciones comunes a este problema diseñado para la plataforma Android? ¿Puede alguien aclarar qué está causando este problema de seguridad NAT-like?

Cualquier vínculo a tutoriales de Java NAT o ejemplos ( no ensayos o tesis) también sería apreciado como útil (ya que no estoy muy seguro de cómo implementarlo en Java).

¡Por supuesto también aceptaré cualquier otra solución que cualquier persona tiene que ofrecer!

Casi todos los teléfonos o PC que alguna vez tocará no tendrán una dirección IP pública estática y, por lo tanto, requerirá recorrido NAT. No es por el dispositivo; El transportista o el ISP ponen enrutadores entre su dispositivo y la Internet pública. Dependiendo de su aplicación, por lo general hay NAT-bibliotecas de recorrido que puede utilizar, como ice4j o STUNT .

Lo hago en mi propio proyecto y he encontrado que este problema no es tan complicado.

Aquí hay un servidor de eco UDP muy simple en node.js

var dgram = require('dgram'); var socket = dgram.createSocket('udp4'); socket .on('listening', function() { var address = socket.address(); console.log('socket listening ' + address.address + ':' + address.port); }) .on('error', function(err) { console.log('socket error:\n' + err.stack); socket.close(); }) .on('message', function(message, rinfo) { console.log('message: ' + message + ' from ' + rinfo.address + ':' + rinfo.port); var msg = new Buffer(rinfo.address + ':' + rinfo.port); socket .send(msg, 0, msg.length, rinfo.port, rinfo.address, function(err, bytes) { //socket.close(); }); }) .bind(15000); 

Un cliente android simplemente envía un msg a este servidor de nodos

  System.out.println("UDP hole punching======================="); class IOth extends Thread { @Override public void run() { String sendMsg = "UDP hole punching"; byte[] buf = sendMsg.getBytes(); DatagramPacket packet; System.out.println(HPremoteHost); // node server IP System.out.println(HPremotePort); // 15000 try { packet = new DatagramPacket(buf, buf.length, InetAddress.getByName(HPremoteHost), HPremotePort); ds.send(packet); } catch (Exception e) { System.out.println("error================"); System.out.println(e); } } } IOth io00 = new IOth(); io00.start(); 

Android Client UDP listner para obtener msg general y su propio ip global y puerto a través de UDPholepunching

  class IOLoop extends Thread { @Override public void run() { try { String msg = "Native.UDPserver.open"; SocketAddress sockAddress; String address; byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, buf.length); while (true) { try { ds.receive(packet); sockAddress = packet.getSocketAddress(); address = sockAddress.toString(); msg = new String(buf, 0, packet.getLength()); System.out.println(msg + " received !!! by " + address); //this case is UDP HolePunching reaction if (address.equals(HPaddress1)) { System.out.println(msg + "hole punched"); //So you can obtain own Global ip& port here. //exchange this information //`remoteHost` `remotePort` to another client //with some method (signaling server) } } catch (IOException e) { } } } catch (Exception e) { } } } IOLoop io00 = new IOLoop(); io00.start(); 

Cliente Android UDP remitente utilizando la propiedad remoteHost otro cliente remoteHost remotePort

  class IOth extends Thread { @Override public void run() { String sendMsg = "This is a test message"; byte[] buf = sendMsg.getBytes(); DatagramPacket packet; try { packet = new DatagramPacket(buf, buf.length, InetAddress.getByName(remoteHost), remotePort); ds.send(packet); } catch (Exception e) { } } } IOth io00 = new IOth(); io00.start(); 

Mira http://sourceforge.net/projects/jnat-pmplib/ Es una implementación de NAT-PMP en java.

He conseguido establecer los sockets simplemente enviando los sockets que está utilizando durante la conexión en su enrutador. Funcionó para mí.

ACTUALIZAR

Averigüe su dirección IP a través de cmd.exe si usa Windows (ipconfig) oa través de una sesión de terminal si está en Linux (ifconfig). A continuación, conéctelo a través del navegador y debe haber una sección de seguridad. Ir al reenvío de puertos y abrir los puertos de su uso al establecer que son ServerSocket y Socket. Utilice TCP como protocolo. Tenga en cuenta que esto sólo se aplica si está intentando conectarse desde fuera de su wlan.

  • ¿Es posible la comunicación peer-to-peer sobre 3G / 4G para teléfonos inteligentes?
  • IO sin bloqueo para Android
  • Creación de una aplicación mediante la demostración WebRTC AppRtc
  • Comunicación P2P en tiempo real entre dispositivos móviles
  • ¿Podemos enviar datos desde un dispositivo Android a otro dispositivo android directamente (p2p) sin servidor en el medio?
  • Cómo detener el descubrimiento de pares en WifiDirect Android
  • Configurar una conexión Wifi-Direct entre Android y Raspberry Pi 3 Linux
  • Android P2P (conexión directa) a través de Internet (detrás de NAT)
  • Androide, socket, programación, atrás, router
  • Controlar el teléfono desde la computadora portátil
  • Problemas de demostración directa de Android WiFi
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.