2017-04-06 1 views
0

私はどのhttpsサーバーにもGET要求を送信するTLSクライアントを作ろうとしています。 ただし、2回目以降にGET要求を送信しようとすると、サーバーからの入力はありません。なぜ他の反応をスキップしているのか分からない。SSLSocketクライアントの入力ストリームがサーバーから何も受信できませんでした

クライアントコード:

public class Main { 

private static final String HOST = "testserver.com"; 
private static final int PORT = 443; 

public static void main(String[] args) throws IOException { 
    BufferedReader socketReader; 
    PrintWriter socketWriter; 

    SSLSocketFactory sslSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
    SSLSocket sslSocket = (SSLSocket) sslSocketFactory.createSocket(HOST, PORT); 
    sslSocket.setKeepAlive(true); 
    sslSocket.setUseClientMode(true); 
    sslSocket.setEnabledProtocols(new String[] { "TLSv1.2" }); 
    sslSocket.setEnabledCipherSuites(new String[] { "TLS_RSA_WITH_AES_128_CBC_SHA" }); 
    sslSocket.startHandshake(); 

    socketWriter = new PrintWriter(new BufferedWriter(new OutputStreamWriter(sslSocket.getOutputStream()))); 
    socketReader = new BufferedReader(new InputStreamReader(sslSocket.getInputStream())); 

    while (true) { 
     socketWriter.print("GET/HTTP/1.0\r\n"); 
     socketWriter.print("Accept: text/plain, text/html, text/*\r\n"); 
     socketWriter.print("\r\n"); 
     socketWriter.flush(); 

     String inputLine; 
     while ((inputLine = socketReader.readLine()) != null) { 
      System.out.println(inputLine); 
     } 

     System.out.println("Finished sending GET Request"); 
    } 

} 

出力例:

HTTP/1.1 200 OK 
Server: nginx/1.10.1 
Date: Thu, 06 Apr 2017 15:37:21 GMT 
Content-Type: text/html 
Content-Length: 110 
Last-Modified: Fri, 31 Mar 2017 19:19:44 GMT 
Connection: close 
Vary: Accept-Encoding 
ETag: "58deabd0-6e" 
Accept-Ranges: bytes 
<html> 
<head> 
    <title>TEST SERVER</title> 
</head> 
<body> 
    TEST 
</body> 
</html> 
Finished sending GET Request 

Finished sending GET Request 

Finished sending GET Request 

Finished sending GET Request 

答えて

1

だと正しくリコール、私はあなたが本当に何をすべき

間違っている可能性がありますあなたのHTTP接続が persistentではない(応答の Connection: closeヘッダーに注意してください)。リクエストに Connection: keep-aliveヘッダーを追加するか、HTTP 1.1に切り替えます(デフォルトでは接続は永続的です)。それ以外の場合は、リクエストごとに新しいTCP接続を作成する必要があります。

+0

ありがとう、アレックス。 HTTPプロトコル仕様を見直さなければならない –

0

私は推測をしなければならなかった場合、私はそのあなたのソケットを閉じて、新しいものを開いていないので、言うだろうしたがって、Webサーバーに関する限り、それは同じ要求です。

EG:

YOU:/index.htmlが
サーバGET:その時点での$ {} FILE_CONTENTS

を、あなたの要求が行われ、私ならば、サーバは、ソケットの彼らの終わりを閉じる必要があります、そのサーバーへの新しいソケットを毎回作るあなたの要求を書き、応答を取得し、ソケットを閉じて、すすぎと繰り返している

関連する問題