为什么用Java发送HTTPS时需要显式CR?

问题描述 投票:-1回答:1

我正在用Java编写一个简单的HTTPS客户端(为我的Web编程课程探索有趣/有趣的实验室的想法)。为了使Web服务器响应,我必须在每行末尾显式添加一个'\ r'。 (如果没有,Web服务器将以状态400进行答复,并且“您的浏览器发送了该服务器无法理解的请求。”)

我必须显式添加“ \ r”;或者,是否缺少我的配置? (换句话说,有没有办法告诉Java自动添加CR?)有趣的是,我还尝试从Mac上的命令行运行openssl来获取网页,而我不得不添加[C0 ]转到命令。

[当我使用“常规”套接字连接到端口80上的HTTP服务器时,我没有这个问题(使用-crlf时类似)。那么,到底谁在挑剔? HTTPS协议是否不同?是否有办法让Java使用'\ r \ n'而不是'\ n'?

我的代码在下面:

telnet
java http
1个回答
3
投票

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作为行尾。

© www.soinside.com 2019 - 2024. All rights reserved.