Я создаю простой HTTP-клиент. Я последовал примеру кода из здесь, который работает для многих сайтов, кроме 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
Я просмотрел другие ответы SO, но это не помогло.
Вот мой код для тестирования:
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();
}
}
@JulianReschke: интересная догадка, но неверная. Даже замена HTTP/1.0 на HTTP/1.1 не сработает - вместо \r\n в конце строки нужен \n (см. Мой ответ).




Хотя ваш запрос похож на HTTP, это не так. Строка, оканчивающаяся на HTTP в соответствии со стандартом, - это \r\n, а не простой \n, как в случае с println. Если вы используете правильную строку, заканчивающуюся во всех местах (т.е. для каждой строки с содержимым, но также и для «пустой» строки, которая завершает заголовок запроса), она также будет работать с www.httpbin.org.
HTTP/1.1 505 HTTP Version Not Supported
Почему этот непонятный ответ сервера? Поскольку в вашем запросе нет надлежащего разделителя между заголовком HTTP и (пустым) телом HTTP, предполагается, что это запрос HTTP 0.9. Давно устаревший протокол HTTP 0.9 не требовал пустой строки, состоящей только из \r\n, в качестве конца заголовка запроса, поскольку в HTTP 0.9 вообще не было таких вещей, как заголовок и тело.
I'm creating a simple HTTP client.
Пожалуйста, не недооценивайте сложность написания правильного HTTP-клиента. Например, код, на который вы ссылались в качестве основы для вашего собственного клиента, не только использовал неправильный конец строки для запроса, но также утверждал, что поддерживает HTTP / 1.1, не имея возможности иметь дело с кодировкой фрагментированной передачи тела.
И, возможно, вам следует пропустить и другой код на этом веб-сайте, если вы действительно хотите изучить протоколы. По крайней мере, Тонкий SMTP-клиент также использует неработающую реализацию протокола.
Спасибо за ответ и время, мне удалось исправить код. После прочтения протокола HTTP я понял, что для него действительно требуется CLRF ("\r\n"). Мне было интересно, почему www.google.ca работает с моим текущим кодом, знаете ли? работает только с \n
@Rana: Многие веб-серверы имеют дело со сломанными клиентами, которые используют неправильное окончание строки, поскольку достаточное количество самодельных клиентов не реализуют должным образом HTTP. Но не все серверы пытаются справиться с такими сломанными клиентами.
Кажется, вы делаете запрос HTTP / 1.0 на сервер, который поддерживает только HTTP / 1.1.