Java-клиент PHP-сервер UDP Hole Punching пример кода

Я работаю над проектом, для которого потребуется сервер ea p2p, но я не нашел код примера java-client php-server. Я понимаю концепцию работы дыры отверстия udp, но я не могу заставить ничего работать в коде.

введите описание изображения здесь

Что я пробовал:

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); } } в 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 – чтобы получить порт других пользователей, я вручную подключаюсь и использую порт, показанный на веб-странице.

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

Проблема с вышеприведенным кодом заключается в том, что он не может подключиться к сокету, если я не перейду вперёд.

Комментарий, если у вас есть вопросы!

У меня была аналогичная проблема. И пытался ее решить аналогичным образом.

Некоторые части вашего кода выглядят неправильно. Сокеты в Java созданы для TCP, но заголовок говорит UDP . Поэтому u должен использовать DatagramSockets. Но потом мы подошли к тому, где я тоже застрял. HTTP-Requests также использует tcp, поэтому открытие порта с HTTP может привести к поврежденному порту, после закрытия сеанса tcp. (Просто догадка)


 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();} } } 

В приведенном выше кодексе теоретически передается HTTP-запрос по UDP. Так что отображаемый порт будет UDP. В моем случае я не получил никакого ответа от PHP Server и застрял в clientSocket.recieve (..). Я думаю, потому что брандмауэр моего веб-сервера блокирует пакеты udp. Если код работает кем-то, я бы сделал следующее:

  1. сохранить все доступ к ips и портам в БД и перечислить их другому клиенту.
  2. Напишите ur Data в DatagramPackets, как показано выше, другому клиенту.

Надеюсь, это поможет. Если кто-то сможет получить его полностью, я тоже буду заинтересован в этом 🙂