【问题标题】:HTTPS GET / HTTP/1.1 request through Java socket通过 Java 套接字的 HTTPS GET / HTTP/1.1 请求
【发布时间】:2017-07-31 23:12:18
【问题描述】:

我正在尝试使用 Java 套接字编程请求 HTTPS 页面。我使用的代码是

PrintWriter s_out = null;

s_out = new PrintWriter(socketData.getOutputStream(), true);

String message = "GET / HTTP/1.1\r\nHost:stackoverflow.com\r\n";

s_out.println(message);

回复是:

HTTP/1.1301MovedPermanentlyLocation:https://stackoverflow.com/X-Request-Guid:b49f01e7-8c3f-4276-b9fe-e325684f0f88Content-Length:143Accept-Ranges:bytesDate:Mon,31Jul201707:15:48GMTVia:1.1varnishConnection:keep-aliveX-Served-By:cache-sin18033-SINX-Cache:MISSX-Cache-Hits:0X-Timer:S1501485348.066340,VS0,VE366Vary:Fastly-SSLX-DNS-Prefetch-Control:offSet-Cookie:prov=929f70a3-e93d-2948-7098-74624f7c4e3c;domain=.stackoverflow.com;expires=Fri,01-Jan-205500:00:00GMT;path=/;HttpOnly<html><head><title>Objectmoved</title></head><body><h2>Objectmovedto<ahref="https://stackoverflow.com/">here</a>.</h2></body></html>

我不知道请求的语法

https://stackoverflow.comGET / HTTP/1.1\r\nHost:stackoverflow.com\r\n

您能否建议调用 https 页面的语法是什么?

谢谢。

【问题讨论】:

  • 你有什么理由使用普通的Socket 来完成这项任务吗?有很多用于发出 HTTP 请求的“高级”Java API
  • 好吧,首先,不确定是否相关,您必须使用 SSL-Socket 而不是普通套接字,因为应该执行其他步骤,这是由 SSL 套接字为您执行的-比如握手、密钥交换……对吧?
  • @Yazan:是的。访问 HTTPS 网址时,您必须使用 SSLSocket 并执行 SSL/TLS 握手,然后才能交换任何与 HTTP 相关的数据。

标签: java sockets https


【解决方案1】:

请求看起来“非常正确”,但似乎使用的是不安全的连接而不是安全的连接。

基于连接的实现

首先,请考虑使用更高级别的抽象,例如HttpsURLConnection (Java Platform SE 8) 类。

请看一下useHttpsConnection()方法的实现。

基于套接字的实现

要建立 HTTPS 连接,SSLSocket (Java Platform SE 8) 应该间接使用类:可以使用SSLSocketFactory (Java Platform SE 8) 类创建实例。

请看一下useSslSocket()方法的实现。

草稿源代码(Java 8)

package com.brunov.test.console;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import javax.net.SocketFactory;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSocketFactory;

public class Program {
    public static void main(final String[] args) throws IOException {
        useHttpsConnection();
        useSslSocket();
    }

    /**
     * Connection-based implementation.
     */
    private static void useHttpsConnection() throws IOException {
        final URL url = new URL("https://stackoverflow.com/");
        final HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
        connection.setRequestMethod("GET");

        try (final InputStream inputStream = connection.getInputStream()) {
            final String response = readAsString(inputStream);
            System.out.println(response);
        }
    }

    /**
     * Socket-based implementation.
     */
    private static void useSslSocket() throws IOException {
        final SocketFactory socketFactory = SSLSocketFactory.getDefault();
        try (final Socket socket = socketFactory.createSocket("stackoverflow.com", 443)) {
            final String request = "GET / HTTP/1.1\r\nConnection: close\r\nHost:stackoverflow.com\r\n\r\n";

            final OutputStream outputStream = socket.getOutputStream();
            outputStream.write(request.getBytes(StandardCharsets.US_ASCII));

            final InputStream inputStream = socket.getInputStream();
            final String response = readAsString(inputStream);
            System.out.println(response);
        }
    }

    /**
     * Helper method.
     * Read a stream to the end into a string.
     */
    private static String readAsString(final InputStream inputStream) throws IOException {
        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        final byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) > 0) {
            outputStream.write(buffer, 0, bytesRead);
        }
        return outputStream.toString(StandardCharsets.UTF_8.name());
    }
}

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    相关资源
    最近更新 更多