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.
- Error de BUS_BLOCKING_CALL_NOT_ALLOWED en AllJoyn
- Conexión de dos dispositivos mediante libgdx
- ¿Cómo crear una conexión peer-to-peer?
- Red inalámbrica Wi-Fi de Android
- ¿Puede Android hacer redes ad-hoc peer-to-peer?
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!
- Arquitectura de Peer-to-Peer de Android / iOS
- Android 7.1.1 Wifi Direct no puede crear grupo
- Conecte 2 o más clientes de Android directamente
- Flujo de aplicaciones para la conexión peer to peer de Android?
- WifiDirectActivity Alteración de la muestra: Transfiere un ArrayList <String> p2p
- Comunicación punto a punto entre dispositivos iOS y Android
- Peer-to-Peer de vídeo de iOS a Android?
- P2P pagos dentro de la aplicación de Android con Paypal
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.
- Android – es onDestroy supone destruir la actividad, sus variables y liberar memoria
- Android: ¿Qué hacer si el rendimiento de ListView sigue siendo insuficiente?