2017-07-31 9 views
1

Javaソケットプログラミングを使用してHTTPSページを要求しようとしています。あなたが何であるかを提案してくださいすることができ、Javaソケット経由のHTTPS GET/HTTP/1.1要求

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> 

私はGET/HTTP/1.1\r\nHost:stackoverflow.com\r\n

https://stackoverflow.comを要求するための構文を知らない

:私が使用するコードは、応答だった

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); 

ですhttpsページを呼び出す構文ですか?

ありがとうございました。

+3

あなたはこのタスクで普通の 'Socket'を使っている理由はありますか? – zuckermanori

+3

HTTPSを行うための「高水準」のJava APIがたくさんありますが、実行するためには他の手順が必要であるため、まずSSLソケットを使用してSSLソケットを使用する必要があります。あなたのために - SSLソケットのようなハンドシェイク、鍵交換、...そう? – Yazan

+1

@ヤザン:はい。 HTTPS URLにアクセスするときは、HTTP関連のデータを交換する前に、 'SSLSocket'を使ってSSL/TLSハンドシェイクを実行する必要があります。 –

答えて

1

リクエストは«かなり正しい»と見えますが、安全な接続の代わりに安全でない接続が使用されているようです。

接続ベースの実装

まず、HttpsURLConnection (Java Platform SE 8)クラスのような、より高いレベルの抽象化を使用することを検討してください。

useHttpsConnection()メソッドの実装を見てください。

ソケットベースの実装

SSLSocket (Java Platform SE 8) クラスが間接的に使用しなければならないHTTPS接続を確立するには、次のインスタンスが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()); 
    } 
} 

は、この情報がお役に立てば幸いです。

関連する問題