有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在代理服务器中用HTTPS建立连接时出现java问题。(连接方法)

我正在开发一个基于java的代理服务器。对于简单的http请求,代理服务器正在工作。但对于HTTPS连接,连接会超时。以下是我所做的步骤。我首先从输入流中读取一行,并创建了一个连接服务器的socket。之后,我给了客户200个状态。之后,我在客户机socket和服务器socket之间异步读写。但目前这不起作用,连接超时,我无法调试这个问题

public class ProxyServer extends Thread {
private String host;
private int port;
private ServerSocket serverSocket;
private InputStream proxyToClientIP;
private OutputStream proxyToClientOP;
private InputStream proxyToServerIP;
private OutputStream proxyToServerOP;
private Socket socket;
private Socket socketFromProxyServer;


ProxyServer(ServerSocket serverSocket, Socket socket) {
    this.serverSocket = serverSocket;
    this.socket = socket;
    this.start();
}

public void run() {
    processInputRequest();
}

public void processInputRequest() {
    try {
        proxyToClientIP = socket.getInputStream();
        proxyToClientOP = socket.getOutputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(proxyToClientIP));
        String hostDetails = reader.readLine();
        System.out.println(hostDetails);
        boolean isConnect = false;
        //Need to parse request and find req type as GET or CONNECT
        //As of now we assume it to be Connect request
        if (!isConnect) {
            processGetRequest();
        } else {
            processConnectRequest();
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

public void processConnectRequest() {
    //Need to get host name from request. Currently Hardcoded for developing purpose
    host = "harish-4072";
    port = 8383;
    try {
        socketFromProxyServer = new Socket(host, port);
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(proxyToClientOP));
        writer.write("HTTP/1.1 200 Connection established\r\n" + "\r\n");
        writer.flush();
        proxyToServerOP = socketFromProxyServer.getOutputStream();
        proxyToServerIP = socketFromProxyServer.getInputStream();
        proxyRequest();
    } catch (IOException ex) {
        System.out.println(ex);
    }
}




public void proxyRequest() {
    try {
        new Thread() {
            @Override
            public void run() {
                try {
                    byte[] read = new byte[1024];
                    int in;
                    System.out.println("Reading");
                    while ((in = proxyToClientIP.read(read)) != -1) {
                        proxyToServerOP.write(read, 0, in);
                        proxyToServerOP.flush();
                    }
                } catch (SocketException e) {
                    System.out.println(e);
                } catch (IOException ex) {

                }
            }
        }.start();
        byte[] reply = new byte[1024];
        int out;
        System.out.println("Writing");
        while ((out = proxyToServerIP.read(reply)) != -1) {
            proxyToClientOP.write(reply, 0, out);

            proxyToClientOP.flush();
        }
    } catch (IOException ex) {

    }

    public void processGetRequest() {
   //
   }
}

共 (1) 个答案

  1. # 1 楼答案

    I first read one line from input stream and created a socket connecting Server. ... After that I asynchronously read and write between Client Socket and Server socket.

    问题是,您只读取了一行,而您需要从客户端读取完整的HTTP请求头,即直到请求头结尾的所有内容(\r\n\r\n

    因为您没有这样做,HTTP请求的未读部分被转发到服务器。但是服务器期望TLS握手的开始,这些数据使服务器感到困惑。这可能会导致挂起或中止,具体取决于数据的内容和服务器的类型