Java套接字:不支持HTTP / 1.1 505 HTTP版本

时间:2018-09-28 16:35:35

标签: java sockets http

我正在创建一个简单的HTTP客户端。我遵循了here的代码示例,该示例适用于www.httbin.org以外的许多站点。当我尝试www.httbin.org时,出现以下错误:

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();
    }
}

1 个答案:

答案 0 :(得分:2)

虽然您的请求看起来与HTTP类似,但与HTTP相似。根据标准,以HTTP结尾的行是\r\n,而不是像\n那样简单的println。如果在所有地方都使用正确的行尾(例如,对于每行包含内容的行,也对于结尾请求标头的“空”行),它也将与www.httpbin.org一起使用。

  

不支持HTTP / 1.1 505 HTTP版本

为什么服务器上的这个令人困惑的答案?由于您的请求在HTTP标头和(空)HTTP主体之间没有适当的分隔符,因此假定它是HTTP 0.9请求。久已淘汰的HTTP 0.9协议不需要仅由\r\n组成的空行作为请求标头的末尾,因为在HTTP 0.9中首先没有标头和正文之类的东西。

  

我正在创建一个简单的HTTP客户端。

请不要低估编写适当的HTTP客户端的复杂性。例如,您作为自己的客户端基础引用的代码不仅为请求使用了错误的行尾,而且还声称支持HTTP / 1.1,而无法处理主体的分块传输编码。

如果您真的想学习协议,也许您也应该跳过本网站中的其他代码。至少Thin SMTP Client还使用了损坏的协议实现。