Perforación UDP en Android; Servidor UDP

Actualmente estoy tratando de implementar perforación udp en Android para mi servidor udp. Las cosas deben funcionar así:

  1. El cliente (detrás de un NAT, tal vez 3G, ..) envía un DatagramPacket al servidor (el servidor tiene un ip público; puerto también se sabe que es 45555). El cliente se repite para enviar un datagrama con un retardo dado
  2. Una vez que el servidor recibió un datagrama, envía Datagramas ("señales") cada 500 ms.
  3. Si el perforado funcionaba, el cliente debería recibir esas señales

Aquí está mi implementación de cliente actual (Android):

//in onCreate() DatagramSocket socket = new DatagramSocket(46222); socket.setSoTimeout(2000); final Thread t = new Thread(new Runnable(){ @Override public void run() { int delay = Integer.parseInt(e2.getText().toString());//e1 and e2 are EditTexts String ip = e1.getText().toString(); try { DatagramPacket packet = new DatagramPacket(new byte[1],1, InetAddress.getByName(ip), 45555); while(!cleanUp){//cleanUp is set to true in onPause() lock.lock(); //Lock lock = new ReentrantLock(); socket.send(packet); lock.unlock(); Thread.sleep(delay); } } catch (Exception e) { e.printStackTrace(); }finally{ if(socket!=null) socket.close(); } } }); final Thread t2 = new Thread(new Runnable(){ @Override public void run() { try { Thread.sleep(1000); DatagramPacket packet = new DatagramPacket(new byte[1],1); while(!cleanUp){ lock.lock(); try{ socket.receive(packet); }catch(SocketTimeoutException e){ lock.unlock(); Thread.sleep(15); continue; } lock.unlock(); final String s = tv.getText().toString()+"signal\n"; MainActivity.this.runOnUiThread(new Runnable(){ @Override public void run() { tv.setText(s);//tv is a TextView } }); Thread.sleep(10); } } catch (Exception e) { e.printStackTrace(); } finally{ if(socket!=null) socket.close(); } } }); //start both threads 

Aquí está la implementación del lado del servidor (Java):

 //int static void main(String[] args): final Thread t = new Thread(new Runnable(){ @Override public void run() { try { DatagramPacket packet = new DatagramPacket(new byte[1],1, addr, port); DatagramSocket socket = new DatagramSocket(); System.out.println("send"); while(true){ socket.send(packet); Thread.sleep(500); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); final Thread t2 = new Thread(new Runnable(){ @Override public void run() { try { DatagramPacket packet = new DatagramPacket(new byte[1],1); DatagramSocket socket = new DatagramSocket(45555); socket.receive(packet); addr = packet.getAddress(); //private static field InetAddress addr port = packet.getPort(); System.out.println(addr+":"+ packet.getPort()); //field int port t.start(); while(true){ socket.receive(packet); System.out.println("idle"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); t2.start(); 

Todo funciona cuando el cliente y el servidor están en la misma red privada. Para imitar el servidor público, ejecuto el código del servidor en mi computadora y configuro un puerto en mi enrutador (que tiene un IP público) *. Los clientes enviarán sus paquetes al IP público del enrutador. Pero en ambos casos (mi smartphone está conectado a Internet a través de mi red wlan / 3G o E) no se reciben señales (el servidor recibe los datagramas del cliente)

Entonces, ¿por qué el proceso de punzonado no funciona?

Saludos

*: El router enviará los paquetes udp enviados a su puerto 45555 a mi computadora

Los diferentes sockets se enlazan a diferentes puertos privados y utilizan diferentes puertos públicos de su NAT. Está recibiendo y enviando a través de diferentes sockets. Envíe con el mismo zócalo a través del cual recibió los datos. Else Su socket que envía está utilizando el diverso puerto público de su ranurador para enviar datos a su NAT de los clientes. Este paquete de NAT de sus clientes descarta porque vino de la misma IP pero puerto desconocido.

  • Recibe UDP en Android Marshmallow
  • Paquetes UDP (vía WiFi Direct) nunca llegan
  • Problema con DatagramSocket en Android 7.1.1
  • Obtener la dirección de difusión wifi en Android wifi hotspot
  • Comunicación UDP de Android
  • Datagram Transport Layer Security (DTLS) en Android / Java
  • No se pueden enviar paquetes UDP de la máquina de desarrollo a Android Emulator
  • Unicast UDP de Android funciona, pero la difusión no
  • Android illegalxception
  • Recibir mensaje de difusión en Android
  • ¿Cómo trabajar con UDP en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.