【问题标题】:Java-Client PHP-Server UDP Hole Punching example codeJava-Client PHP-Server UDP打孔示例代码
【发布时间】:2017-09-15 04:30:42
【问题描述】:

我正在做一个需要 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);
    }
}

PHP-CONNECT.php - 为了获取其他用户的端口,我手动连接并使用网页上显示的端口。

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

上面代码的问题是,除非我进行端口转发,否则它无法进入套接字。

有什么问题可以留言!

【问题讨论】:

  • 你已经写过代码了吗?如果是这样,请提供代码并说明究竟是什么不工作
  • 我现在没有任何代码,否则我会添加它
  • 欢迎来到 Stack Overflow,请阅读本站中的 how to ask a question。在询问之前始终保持具体并尽最大努力,并且不要将 Stack Overflow 视为教程的存储库。我会推荐你​​实现一个简单的PHP server。然后,您可以询问如何将Java Client 连接到您的特定PHP Server,这将给这里的人们提供一些想法。
  • @teocci 该图描述了允许我在不使用端口转发的情况下通过的连接路径,我所要求的只是有关如何完成此操作的示例代码 :)
  • 我告诉过你这不是一个教程库。如果你想要一个例子去 Github 或者在 google 上搜索。如果您想提出正确的问题,请阅读本网站中的how to ask a question

标签: java php sockets udp hole-punching


【解决方案1】:

我遇到了类似的问题。并试图以类似的方式解决它。

您的代码的某些部分在我看来是错误的。 Java 中的套接字是为 TCP 制作的,但标题是 UDP。因此你应该使用 DatagramSockets。 但后来我们到了我也卡住的地步。 HTTP-Requests 也使用 tcp,因此在 tcp 会话关闭后,使用 HTTP 打开端口可能会导致端口损坏。 (只是猜测)


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 over UDP 请求。这样显示的端口将是 UDP 端口。就我而言,我没有得到 PHP 服务器的任何响应并停留在 clientSocket.recieve(..) 。我猜是因为我的网络服务器的防火墙阻止了 udp 数据包。 如果代码对任何人都有效,我会这样处理:

  1. 将所有访问的 ips 和端口保存到数据库中,并将它们列出给其他客户端。
  2. 将您的数据写入上述 DatagramPackets 中的数据到其他客户端。

我希望这可能会有所帮助。如果有人能让它完全工作,我也会对它感兴趣:)

【讨论】:

    猜你喜欢
    • 2015-01-23
    • 2014-10-17
    • 2011-11-27
    • 2012-03-28
    • 2015-02-10
    • 2011-11-27
    • 2012-04-11
    • 2011-06-14
    • 2019-04-11
    相关资源
    最近更新 更多