Java-Client PHP-Server UDP Hole Punching example code

Estou trabalhando em um projeto que exigirá um servidor p2p, mas não encontrei nenhum código de exemplo do servidor phpjava-cliente. Eu entendo o conceito de como o perfuração do udp funciona, mas não consigo que nada funcione no código.

insira a descrição da imagem aqui

O que tentei:

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 obter a porta dos outros usuários, eu conecto manualmente e use a porta mostrada na página da Web.

  

O problema com o código acima, é que ele não pode chegar ao soquete, a menos que eu avanço.

Comente se você tiver alguma dúvida!

Eu estava enfrentando um problema semelhante. E estava tentando resolvê-lo de forma semelhante.

Algumas partes do seu código parecem erradas para mim. Sockets em Java são feitos para TCP, mas o título diz UDP . Portanto, você deve usar DatagramSockets. Mas então, chegamos ao ponto em que eu coloquei também. HTTP-Requests usa tcp também, então abrir a porta com HTTP pode levar a uma porta corrompida, depois que a session tcp foi fechada. (Apenas um palpite)


 public class Main { public static void main(String[] args) { try { String httpRequest = "GET /index.php HTTP/1.1\n" + "Host: "; InetAddress IPAddress = InetAddress.getByName(); 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();} } } 

O código acima teoricamente indica uma solicitação HTTP sobre UDP. Para que a porta exibida seja a UDP. No meu caso, não recebi nenhuma resposta do Servidor PHP e preso no clientSocket.recieve (…). Acho que o firewall do meu servidor web bloqueia os pacotes udp. Se o código funcionar por qualquer pessoa, eu procederia assim:

  1. salve todos os accesss ips e portas a um database e liste-os para o outro cliente.
  2. Escreva seus dados em DatagramPackets como acima para o outro cliente.

Espero que isso possa ajudar. Se alguém puder obtê-lo funcionando completamente, também estaria interessado nisso 🙂