SSLSocket客户端的输入流无法从服务器接收任何东西
问题描述:
我试图让TLS客户端发送GET请求到任何https服务器。 但是,第二次尝试发送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
答
这因为您的HTTP连接不是persistent(请注意响应中的Connection: close
标题)。您需要将Connection: keep-alive
标头添加到请求或切换到HTTP 1.1(默认情况下,连接是持久的)。否则,你将不得不为每个请求创建新的TCP连接。
答
如果我不得不作出一个猜测,我会说的,因为你不关闭你的插座,打开一个新,就Web服务器而言,这是相同的请求。
EG:
YOU:GET /INDEX.HTML
SERVER:$ {} FILE_CONTENTS
在这一点上,你的要求做了,服务器关闭套接字的结束,如果我记错,但我可能是错
你真正应该做的是让每一次新的套接字到该服务器,写你的请求,得到响应,关闭套接字,冲洗和重复
谢谢Alex。应该检查HTTP协议规范 –