HTTP / HTTPS客户端,HTTPS请求上的“连接重置”

时间:2015-03-07 01:05:08

标签: java sockets http https

我正在尝试使用java 创建一个简单的 HTTP / HTTPS客户端。我现在在Client.java文件中所做的就是这里。

当我尝试访问www.google.com:80时,一切正常。我在响应BufferedReader中获取了完整的HTML内容。

但是,当我尝试访问www.google.com:443时,没有数据通过BufferedReader

www.facebook.com:80,

HTTP/1.1 302 Found

此外,当我尝试使用www.facebook.com:443时,出现以下错误:

Exception in thread "main" java.net.SocketException: Connection reset

我哪里错了?为什么我无法获得HTTPS站点的任何响应?

public class Client {

    public static void main(String[] args) throws IOException {

        //String host = args[0];
        //int port = Integer.parseInt(args[1]);
        //String path = args[2];

        int port = 80;
        String host = "www.google.com";
        String path = "/";

        //Opening Connection
        Socket clientSocket = new Socket(host, port);
        System.out.println("======================================");
        System.out.println("Connected");
        System.out.println("======================================");

        //Declare a writer to this url
        PrintWriter request = new PrintWriter(clientSocket.getOutputStream(),true);

        //Declare a listener to this url
        BufferedReader response = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

        //Sending request to the server
        //Building HTTP request header
        request.print("GET "+path+" HTTP/1.1\r\n"); //"+path+"
        request.print("Host: "+host+"\r\n");
        request.print("Connection: close\r\n");
        request.print("\r\n");
        request.flush();

        System.out.println("Request Sent!");
        System.out.println("======================================");

        //Receiving response from server
        String responseLine;
        while ((responseLine = response.readLine()) != null) {
            System.out.println(responseLine);
        }
        System.out.println("======================================"); 
        System.out.println("Response Recieved!!");
        System.out.println("======================================");
        request.close();
        response.close();
        clientSocket.close();
    }
}

1 个答案:

答案 0 :(得分:4)

HTTPS已加密;它是通过SSL的HTTP。您不能只发送原始HTTP请求。如果您在没有首先建立安全连接的情况下开始发送数据,则服务器将立即断开连接(因此连接重置错误)。您必须首先建立SSL连接。在这种情况下,您希望使用SSLSocket(通过SSLSocketFactory,另请参阅example)而不是Socket

就像为HTTPS情况更改代码的一行一样简单(如果计算异常规范并且端口号更改为443,则为三行):

Socket clientSocket = SSLSocketFactory.getDefault().createSocket(host, port);

请注意,在这种情况下,clientSocket将是SSLSocket的实例(源自Socket)。

但是,如果您将此作为更大应用程序的一部分(而不仅仅是学习体验),请考虑现有的库,例如Apache的HttpClient(也支持HTTPS)或者在HttpURLConnectionHttpsURLConnection中,如果您需要更基本的内容。如果您需要在应用程序中嵌入服务器,则可以使用内置的HttpServerHttpsServer

也是EJP在comment中提到的问题。