2017-04-06 4 views
0

Ich versuche, ein TLS-Client zu machen, die GET-Anforderung an jeden https-Server versenden. Es gibt jedoch keine Eingabe vom Server, wenn es versucht, GET-Anforderung zum zweiten Mal und mehr zu senden. Ich kann nicht verstehen, warum es andere Antworten auslässt.Eingangsstrom des SSLSocket Client kann nichts vom Server empfängt

Client-Code:

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

} 

Ausgabebeispiel:

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 

Antwort

1

wiederholen das ist, weil Ihre HTTP-Verbindung nicht persistent ist (beachten Sie die Connection: close Header in der Antwort). Sie müssen entweder den Header Connection: keep-alive zur Anforderung hinzufügen oder zu HTTP 1.1 wechseln (die Verbindungen sind standardmäßig persistent). Andernfalls müssen Sie für jede Anforderung eine neue TCP-Verbindung erstellen.

+0

Danke, Alex. Sollte die HTTP-Protokollspezifikationen überprüfen –

0

Wenn ich eine Vermutung machen müsste, würde ich sagen, seine weil Sie nicht Ihre Steckdose zu schließen und eine neue Öffnung Soweit es den Webserver betrifft, ist es die gleiche Anfrage.

Beispiel:

SIE: GET /index.html
SERVER: $ {} FILE_CONTENTS

an diesem Punkt Ihre Anfrage durchgeführt wird, sollte der Server ihre Ende der Fassung schließen, wenn i richtig erinnere, aber ich kann falsch sein

Was Sie wirklich tun sollten, ist eine neue Buchse jedes Mal an diesen Server machen, Ihre Anfrage schreiben, die Antwort zu erhalten, schließen Sie die Buchse, spülen und

Verwandte Themen