Элементарный доступ к webdata (html) через соединение с сокетом (порт 80) с использованием Python

#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 файл).

источник: https://medium.com/from-the-scratch/http-server-what-do-you-need-to-know-to-build-a-simple-http-server-from-scratch-d1ef8945e4fa

Реализация протокола http в Linux аналогична …

Так mysock.send(cmd) похоже на open(document) , потому что с ним GET выполняется отправка, которая заставляет сервер искать файл / проверять, существует ли он

Комментарии:

1. Спасибо за обсуждение; Я почувствовал, что mysock.send (cmd) более близок к open (‘document’); однако тест, по которому я получил оценку, показывает mysock.connect ((‘data.pr4e.org ‘, 80)) в качестве ответа :/