我正在用Java编写一个简单的HTTPS客户端(为我的Web编程课程探索有趣/有趣的实验室的想法)。为了使Web服务器响应,我必须在每行末尾显式添加一个'\ r'。 (如果没有,Web服务器将以状态400进行答复,并且“您的浏览器发送了该服务器无法理解的请求。”)
我必须显式添加“ \ r”;或者,是否缺少我的配置? (换句话说,有没有办法告诉Java自动添加CR?)有趣的是,我还尝试从Mac上的命令行运行openssl
来获取网页,而我不得不添加[C0 ]转到命令。
[当我使用“常规”套接字连接到端口80上的HTTP服务器时,我没有这个问题(使用-crlf
时类似)。那么,到底谁在挑剔? HTTPS协议是否不同?是否有办法让Java使用'\ r \ n'而不是'\ n'?
我的代码在下面:
telnet
HTTP标准明确要求public class HTTPSClient {
public static void main(String[] args) throws Exception {
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) factory.createSocket("www.emu.edu", 443);
socket.startHandshake();
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
out.println("GET / HTTP/1.1\r");
out.println("host: www.emu.edu\r");
out.println("connection: close\r");
out.println("\r");
out.flush();
/*
* Make sure there were no surprises
*/
if (out.checkError())
System.out.println("SSLSocketClient: java.io.PrintWriter error");
/* read response */
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
}
socket.close();
}
}
。大多数服务器虽然也接受简单的\r\n
-但实际上某些服务器对标准有严格(正确的)解释。我的猜测是,与Java应用程序相比,您已经使用“常规”套接字测试了不同的服务器。并且与\n
一样-根据设置,它实际上可能会发送telnet
而不是仅发送\r\n
作为行尾。