Java套接字:不支持HTTP/1.1505 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客户端。我遵循了一个代码示例,该示例适用于除。当我尝试时,会出现以下错误:

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。但并不是所有的服务器都试图处理这样的坏客户机。