Java套接字:不支持HTTP/1.1505 HTTP版本
我正在创建一个简单的HTTP客户端。我遵循了一个代码示例,该示例适用于除。当我尝试时,会出现以下错误:Java套接字:不支持HTTP/1.1505 HTTP版本,java,sockets,http,Java,Sockets,Http,我正在创建一个简单的HTTP客户端。我遵循了一个代码示例,该示例适用于除。当我尝试时,会出现以下错误: HTTP/1.1 505 HTTP Version Not Supported Connection: close Server: Cowboy Date: Fri, 28 Sep 2018 16:28:50 GMT Content-Length: 0 我看过其他的答案,但都没用 以下是我的测试代码: import java.io.IOException; import java.io.In
HTTP/1.1 505 HTTP Version Not Supported
Connection: close
Server: Cowboy
Date: Fri, 28 Sep 2018 16:28:50 GMT
Content-Length: 0
我看过其他的答案,但都没用
以下是我的测试代码:
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
public class Main {
public static void main(String[] args) throws IOException {
//Connection details
InetAddress address = InetAddress.getByName("www.httpbin.org");
Socket mySocket = new Socket(address, 80);
//Streams
PrintWriter mySocketOutput = new PrintWriter(mySocket.getOutputStream(), true);
InputStreamReader inputStreamReader = new InputStreamReader(mySocket.getInputStream());
//Headers
mySocketOutput.println("GET / HTTP/1.0");
mySocketOutput.println("Host: www.httpbin.org");
mySocketOutput.println("Connection: close");
mySocketOutput.println();
boolean loop = true;
StringBuilder stringBuilder = new StringBuilder();
//reading results from server
while (loop) {
if(inputStreamReader.ready()) {
int currentChar = 0;
while (currentChar != -1) {
currentChar = inputStreamReader.read();
stringBuilder.append((char) currentChar);
}
loop = false;
}
}
//print result
System.out.println(stringBuilder.toString());
mySocket.close();
}
}
虽然您的请求看起来类似于HTTP,但事实并非如此。根据标准,以HTTP结尾的行是
\r\n
,而不是像使用println
那样简单的\n
。如果在所有位置使用正确的行结尾(即,对于包含内容的每一行,以及对于结束请求标题的“空”行),它也将与www.httpbin.org
一起使用
不支持HTTP/1.1 505 HTTP版本
为什么服务器会给出这个令人困惑的答案?因为您的请求在HTTP头和(空的)HTTP正文之间没有正确的分隔符,所以假定它是HTTP 0.9请求。长期过时的协议不需要只包含\r\n
的空行作为请求结束标头,因为HTTP 0.9中首先没有标头和正文之类的内容
我正在创建一个简单的HTTP客户端
请不要低估编写正确的HTTP客户端的复杂性。例如,您引用的代码作为自己客户机的基础,它不仅为请求使用了错误的行尾,而且还声称支持HTTP/1.1,但无法处理正文的分块传输编码
如果你真的想学习协议,也许你也应该跳过这个网站上的其他代码。至少还使用了中断的协议实现。虽然您的请求看起来类似于HTTP,但实际上并非如此。根据标准,以HTTP结尾的行是
\r\n
,而不是像使用println
那样简单的\n
。如果在所有位置使用正确的行结尾(即,对于包含内容的每一行,以及对于结束请求标题的“空”行),它也将与www.httpbin.org
一起使用
不支持HTTP/1.1 505 HTTP版本
为什么服务器会给出这个令人困惑的答案?因为您的请求在HTTP头和(空的)HTTP正文之间没有正确的分隔符,所以假定它是HTTP 0.9请求。长期过时的协议不需要只包含\r\n
的空行作为请求结束标头,因为HTTP 0.9中首先没有标头和正文之类的内容
我正在创建一个简单的HTTP客户端
请不要低估编写正确的HTTP客户端的复杂性。例如,您引用的代码作为自己客户机的基础,它不仅为请求使用了错误的行尾,而且还声称支持HTTP/1.1,但无法处理正文的分块传输编码
如果你真的想学习协议,也许你也应该跳过这个网站上的其他代码。至少还使用了中断的协议实现。似乎您正在向仅支持HTTP/1.1的服务器发出HTTP/1.0请求。@JulianReschke:有趣的猜测,但错了。即使将
HTTP/1.0
替换为HTTP/1.1
也行不通-它需要\r\n
而不是\n
作为行尾(参见我的答案)。似乎您正在向只支持HTTP/1.1的服务器发出HTTP/1.0请求。@JulianReschke:有趣的猜测,但错误。即使将HTTP/1.0
替换为HTTP/1.1
也不起作用-它需要\r\n
而不是\n
作为行尾(请参见我的答案)。感谢您的回答和时间,我能够修复代码。阅读HTTP协议后,我意识到它确实需要CLRF(“\r\n”)
。我想知道为什么www.google.ca使用我当前的代码,你知道吗?它与\n
only@Rana:许多web服务器处理断开的客户端,这些客户端使用不正确的行结尾,因为有足够多的自制客户端没有正确实现HTTP。但并不是所有的服务器都试图处理这样的坏客户端。谢谢你的回答和时间,我能够修复代码。阅读HTTP协议后,我意识到它确实需要CLRF(“\r\n”)
。我想知道为什么www.google.ca使用我当前的代码,你知道吗?它与\n
only@Rana:许多web服务器处理断开的客户端,这些客户端使用不正确的行结尾,因为有足够多的自制客户端没有正确实现HTTP。但并不是所有的服务器都试图处理这样的坏客户机。