[英]Using user's input as a host in a Python-based primitive "browser"
我有一個微不足道的問題。 如何在帶有套接字庫的 Python 應用程序中使用用戶輸入作為 URL?
我有這個代碼:
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()
現在我應該更改它,以便應用程序打開用戶提供的 URL,而不是現在硬編碼的 URL。 我嘗試了很多東西,所有的東西都失敗了,並顯示了不同的錯誤消息。
我嘗試過的事情:1)
url = input("Enter URL: ")
[...]
cmd = 'GET url HTTP/1.0\r\n\r\n'.encode()
mysock.send(cmd)
然后我嘗試用逗號將我的 url 變量與行的其余部分分開:
cmd = 'GET', url, 'HTTP/1.0\r\n\r\n'.encode()
我也嘗試發揮創意:
url = input("Enter URL: ")
realurl = "GET" + " " + url + " " + "HTTP/1.0\r\n\r\n'.encode()"
[...]
cmd = realurl
mysock.send(cmd)
為簡單起見,現在讓我們跳過 mysock.connect 內容的問題 - 我試圖通過指向同一主機上的頁面的鏈接來啟動該應用程序。
cmd = 'GET http://data.pr4e.org/romeo.txt HTTP/1.0\\r\\n\\r\\n'.encode()
應該
cmd = 'GET /romeo.txt HTTP/1.0\\r\\n\\r\\n'.encode()
域不應包含在路徑中...添加一個host
標頭,其中包含http://data.pr4e.org/
作為值....
如果您打印了cmd
那么您的問題就很清楚了。 格式不正確,需要將.encode()
應用於整個連接的字符串!
cmd = 'GET url HTTP/1.0\\r\\n\\r\\n'.encode()
是一個類似於 obj 的字節,不包括實際的 url
cmd = 'GET', url, 'HTTP/1.0\\r\\n\\r\\n'.encode()
是一個元組(str, str, bytes)
realurl = "GET" + " " + url + " " + "HTTP/1.0\\r\\n\\r\\n'.encode()"
是一個包含字符串.encode()
而不是將其應用於str
.
url = input("Enter Url: ")`
cmd = 'GET ' + url + ' HTTP/1.0\r\n\r\n'
# Encode encodes a string to a bites like obj.
# Therefore we must apply it to the entire string!
mysock.send(cmd.encode())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.