Первоначально это был ответ на ваш вопрос в комментарии о сообщении "DO NOT USE vbird.org"
- но, наконец, это решило и другую проблему.
linux.vbird.org
и vbird.org
имеют одинаковый IP-адрес. Они находятся на одном сервере.
Сокет преобразует linux.vbird.org
в IP и использует IP для подключения к серверу - поэтому сервер не знает, что вы хотите получить файл с linux.vbird.org
. Он думает, что вы хотите от vbird.org
, который является основным доменом. linux.vbird.org
является единственным поддоменом в домене vbird.org
.
Вам потребуется использовать заголовок host: linux.vbird.org
в запросе, чтобы сообщить серверу, с какого субдомена вы пытаетесь получить файл.
GET /linux_basic/0330regularex/regular_express.txt HTTP/1.0
Host: linux.vbird.org
С этим заголовком он отправляет ваш файл.
Я проверил этот заголовок с вашим кодом и случайно решил проблему с кодировкой, поскольку ваш файл находится в UTF-8
и сервер отправил его какUTF-8
и нет проблем с buf.decode('utf-8')
import socket
import sys
host = 'linux.vbird.org'
port = '80'
filename = '/linux_basic/0330regularex/regular_express.txt'
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, int(port)))
print("Connecting successful!\n")
str = "GET %s HTTP/1.0\r\nHost: %s\r\n\r\n" % (filename,host)
print(str)
s.sendall(str.encode('utf-8'))
while True:
try:
buf = s.recv(2048)
except socket.error as e:
print("Error receiving data: %s" % e)
sys.exit(1)
if not len(buf):
break
#print(buf)
sys.stdout.write(buf.decode('utf-8'))