У меня возникли проблемы в этом упражнении с питоном - PullRequest
0 голосов
/ 06 мая 2019

У меня проблема с этим упражнением, вот упражнение:

Измените вашу программу сокетов так, чтобы она считала число символов, он получил и перестает отображать любой текст после того, как он показал 3000 символов. Программа должна извлечь весь документ и подсчитать общее количество символов и отобразить счет количества символов в конце документа.

Оригинальный код:

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.0\r\n\r\n'.encode()
mysock.send(cmd)
while True:
data = mysock.recv(512)
if len(data) < 1:
break
print(data.decode(),end='')
mysock.close()

МОЙ КОД:

import socket
url=input("Enter a URL :\n")
count=0
host_name=url.split("/")[2]
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    mysock.connect((host_name, 80))
    cmd=('GET url HTTP/1.0\n\n'.encode())
    mysock.send(cmd)
except:
    print("Enter a valid URl")
exit()


while True:
    data = mysock.recv(512)
    count=count+len(data)
    if len(data) < 1:
        break
    print(data.decode())
mysock.close()

Мой вывод:

Enter a URL :
http://www.py4inf.com/code/romeo.txt
HTTP/1.1 400 Bad Request
Server: nginx
Date: Mon, 06 May 2019 10:29:37 GMT
Content-Type: text/html
Content-Length: 166
Connection: close

<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>

Я получаю сообщение об ошибке "400 Bad request"

Может кто-нибудь помочь мне, спасибо

1 Ответ

0 голосов
/ 09 мая 2019

Этот код работал для меня:

import socket
from urllib.parse import urlsplit

url = urlsplit('http://www.py4inf.com/code/romeo.txt')
host = url.hostname
path = url.path

request = f'GET {path} HTTP/1.1\nHost: {host}\n\n'.encode('utf-8')
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, 80))
s.send(request)
result = s.recv(10000)
while (len(result) > 0):
    print(result.decode('utf-8'))

А вот вывод кода выше:

 HTTP/1.1 200 OK
 Content-Type: text/plain
 Content-Length: 167
 Connection: keep-alive
 Keep-Alive: timeout=15
 Date: Thu, 09 May 2019 08:49:50 GMT
 Server: Apache
 Last-Modified: Fri, 04 Dec 2015 19:05:04 GMT
 ETag: "a7-526172f58b800"
 Accept-Ranges: bytes
 Cache-Control: max-age=604800, public
 Access-Control-Allow-Origin: *
 Access-Control-Allow-Headers: origin, x-requested-with, content-type
 Access-Control-Allow-Methods: GET

 But soft what light through yonder window breaks
 It is the east and Juliet is the sun
 Arise fair sun and kill the envious moon
 Who is already sick and pale with grief

Редактировать: здесь исправлен ваш оригинальный код:

import socket
from urllib.parse import urlsplit

url = urlsplit(input("Enter a URL: ").strip())
count = 0
host = url.hostname
path = url.path
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    print(f'Connecting to {host} and fetching {path}')
    s.connect((host, 80))
    cmd = f'GET {path} HTTP/1.1\nHost: {host}\n\n'.encode('utf-8')
    s.send(cmd)
except:
    print("Enter a valid URl")
    exit()

while True:
    data = s.recv(512)
    count += len(data)
    if len(data) < 1:
        break
    print(data.decode())

s.close()

А вот вывод, который я получаю, используя приведенный выше код:

Enter a URL: http://www.py4inf.com/code/romeo.txt
Connecting to www.py4inf.com and fetching /code/romeo.txt
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 167
Connection: keep-alive
Keep-Alive: timeout=15
Date: Thu, 09 May 2019 15:30:16 GMT
Server: Apache
Last-Modified: Fri, 04 Dec 2015 19:05:04 GMT
ETag: "a7-526172f58b800"
Accept-Ranges: bytes
Cache-Control: max-age=604800, public
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: origin, x-requested-with, content-type
Access-Control-Allow-Methods: GET

But soft what light through yonder window breaks
It is the east and Juliet 
is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...