#python #sockets #networking
#python #сокеты #сеть
Вопрос:
Мой вопрос теоретический: мы можем использовать библиотеку urllib (urlopen) для возврата HTML-страницы; Я понимаю, что это data = mysock.recv(512)
ведет себя как document.read()
для полученных данных (UTF-8 или ASCII).
Какой код в приведенных ниже строках работает как open('document')
функция? open('document')
находит указанный файл и проверяет, существует ли он, я предполагаю, что mysock.send(cmd)
это эквивалентно, поскольку он отправляет запрос GET на веб-сервер для получения указанного файла с адреса.
import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('data.pr4e.org', 80))
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0nn'.encode()
mysock.send(cmd)
while True:
data = mysock.recv(512)
if (len(data) < 1):
break
print(data.decode())
mysock.close()
Редактировать: кажется, я нашел ответ, но более тщательные рассуждения остаются желательными.
Ответ №1:
После тщательного изучения правильный ответ на этот вопрос таков: mysock.connect(('data.pr4e.org', 80))
ведет себя аналогично open('romeo.txt')
; хотя это позволяет подключаться только к хост-домену через порт 80 и open()
отличается, поскольку определяет местонахождение ‘romeo.txt ‘ в определенном месте.
Ответ №2:
Вы правы, что метод http GET
выполняет поиск файла на сервере. В https://medium.com/from-the-scratch/http-server-what-do-you-need-to-know-to-build-a-simple-http-server-from-scratch-d1ef8945e4fa является примером реализации GET
метода на C :
ПОЛУЧИТЬ /info.html HTTP/1.1
Итак, нам просто нужно найти info.html файл в текущем каталоге (поскольку
/
указано, что он просматривается в корневом каталоге сервера. Если это похоже на /messages/info.html затем мы должны заглянуть в папку messages для info.html файл).
Реализация протокола http в Linux аналогична …
Так mysock.send(cmd)
похоже на open(document)
, потому что с ним GET
выполняется отправка, которая заставляет сервер искать файл / проверять, существует ли он
Комментарии:
1. Спасибо за обсуждение; Я почувствовал, что mysock.send (cmd) более близок к open (‘document’); однако тест, по которому я получил оценку, показывает mysock.connect ((‘data.pr4e.org ‘, 80)) в качестве ответа :/