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

Я работаю над проектом, который требует ea p2p-сервера, но я не нашел ни одного примера кода php-сервера java-client. Я понимаю концепцию, как работает дырокол 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);
    }
}

PHP-CONNECT.php - чтобы получить порт других пользователей, я вручную подключаюсь и использую порт, показанный на веб-странице.

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

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

Прокомментируйте, если у вас есть какие-либо вопросы!

1 ответ

Я столкнулся с аналогичной проблемой. И пытался решить это аналогичным образом.

Некоторые части вашего кода выглядят неправильно для меня. Сокеты в Java сделаны для TCP, но заголовок гласит UDP. Поэтому вы должны использовать DatagramSockets. Но потом мы подошли к тому, что я тоже застрял. HTTP-запросы также используют 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 и застрял в clientSocket.recieve(..) . Я думаю, потому что брандмауэр моего веб-сервера блокирует пакеты udp. Если код работает кем-то, я бы поступил так:

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

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

Другие вопросы по тегам