java php sockets udp hole-punching

Java-Client PHP-Server UDP Hole Punching código de ejemplo



sockets hole-punching (1)

Estoy trabajando en un proyecto que requerirá un servidor ea p2p, pero no he encontrado ningún código de ejemplo de servidor php de Java. Entiendo el concepto de cómo funciona el punzonado udp pero no puedo hacer que funcione nada en el código.

Lo que he intentado:

TheSocket.java

public class TheSocket { public static String response = "hello"; public static String request; public static String webServerAddress; public static ServerSocket s; protected static ServerSocket getServerSocket(int port)throws Exception{ return new ServerSocket(port); } public static void handleRequest(Socket s){ BufferedReader is; PrintWriter os; try{ webServerAddress = s.getInetAddress().toString(); is = new BufferedReader(new InputStreamReader(s.getInputStream())); request = is.readLine(); System.out.println(request); os = new PrintWriter(s.getOutputStream(), true); os.println("HTTP/1.0 200"); os.println("Content-type: text/html"); os.println("Server-name: TheSocket"); os.println("Content-length: " + response.length()); os.println(""); os.println(response); os.flush(); os.close(); s.close(); }catch(Exception e){ System.out.println("Failed to send response to client: " + e.getMessage()); }finally{ if(s != null){ try{ s.close(); }catch(Exception e){ e.printStackTrace(); } } } return; } }

Main.java

public class Main { public static void main(String[] args)throws Exception{ TheSocket.s = TheSocket.getServerSocket(6789); while(true){ Socket serverSocket = TheSocket.s.accept(); TheSocket.handleRequest(serverSocket); } }

PHP-CONNECT.php: para obtener el puerto de los otros usuarios, me conecto y uso manualmente el puerto que se muestra en la página web.

<?php echo $_SERVER[''REMOTE_ADDR''].'':''.$_SERVER[''REMOTE_PORT'']; ?>

El problema con el código anterior, es que no puede conectarse al socket a menos que sea port forward.

Comenta si tienes alguna pregunta!


Estaba enfrentando un problema similar. Y estaba tratando de resolverlo de manera similar.

Algunas partes de tu código me parecen incorrectas. Los zócalos en Java están hechos para TCP pero el título dice UDP . Por lo tanto, deberías usar DatagramSockets. Pero luego llegamos al punto donde también me pegué. Las solicitudes HTTP también usan tcp, por lo que abrir el puerto con HTTP puede dar lugar a un puerto dañado, después de cerrar la sesión tcp. (Solo una suposición)

public class Main { public static void main(String[] args) { try { String httpRequest = "GET /index.php HTTP/1.1/n" + "Host: <PHP SERVER NAME HERE>"; InetAddress IPAddress = InetAddress.getByName(<PHP SERVER IP HERE>); DatagramSocket clientSocket = new DatagramSocket(); byte[] sendData = new byte[1024]; byte[] receiveData = new byte[1024]; String sentence = httpRequest; sendData = sentence.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 80); clientSocket.send(sendPacket); DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); clientSocket.receive(receivePacket); String modifiedSentence = new String(receivePacket.getData()); System.out.println("FROM SERVER:" + modifiedSentence); clientSocket.close(); }catch(Exception e){e.printStackTrace();} } }

El Código anterior teóricamente detecta una solicitud HTTP a través de UDP. De modo que el puerto mostrado será el UDP. En mi caso, no recibí ninguna respuesta del servidor PHP y me quedé atrapado en clientSocket.recieve (..). Supongo que porque el firewall de mi servidor web está bloqueando paquetes udp. Si el código funciona por cualquier persona, procedo así:

  1. guarde todos los ips y puertos de acceso a un DB y listéelos al otro cliente.
  2. Escriba sus datos en los DatagramPackets como los de arriba para el otro cliente.

Espero que esto pueda ayudar. Si alguien puede obtenerlo trabajando completamente, también me interesaría :)