В некотором смысле ваш код работает, потому что он может успешно отправить запрос на сервер, и вы вернете верный результат.Вы можете видеть, что само сообщение об ошибке приходит с сервера.
Но вы не получите ожидаемый результат обратно, так что это действительно проблема.Непосредственное открытие http://data.pr4e.org/romeo.txt в браузере работает правильно, поэтому давайте посмотрим немного дальше, например, на вопросы, как заголовок ошибки 400 с сокетами , которые решают практически ту же проблему.
После некоторых экспериментов кажется, что веб-серверу требуется конец строки в стиле Microsoft Windows: и \r
, и \n
.Просто \n
, как в вашей попытке, не работает - вы получите эту ошибку обратно.Просто \r
заставляет сервер ждать бесконечно (или, скорее, «довольно долго и, конечно, дольше, чем я был готов ждать этого эксперимента»).
Итак, эта простая модификация заставляет вашу оригинальную программу работать:
mysock.send(b'GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n')
и возвращает после нескольких заголовков следующую поэзию:
... But soft what bytes through yonder port breaks
It is a request and Http is the Sun ...
(по общему признанию, слегка перефразирован)
В некоторых операционных системах (Я знаю только Microsoft Windows), стандартный код для конца строки \n
автоматически получает , расширенный до \r\n
.Поэтому разумно предположить, что ваш рабочий пример кода был написан и протестирован на компьютере Windows, и его автор никогда не знал (или не заботился), что сервер Apache ожидает этот явный тип окончания строки.