import socket
import os
user_url = input("Enter url: ")
host_name = user_url.split("/")[2]
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect((host_name, 80))
cmd = 'GET ' + user_url + ' 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='\n')
mysock.close()
出于某种原因,我会收到此错误
输入网址:http://data.pr4e.org/romeo.txt
7 mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 8 mysock.connect((host_name, 80)) 9 cmd = 'GET ' + user_url + ' HTTP/1.0\r\n\r\n'.encode() TypeError: can only concatenate str (not "bytes") to str
我有什么想法吗?编码和解码对我来说似乎是正确的,我在.encode()之前使用\ n进行了编码和解码。 这是一堂课
答案 0 :(得分:2)
str
是Unicode代码点的抽象序列; bytes
是8位数字的序列。 Python 3非常清楚地区分了两者,并且不允许您隐式组合它们。 str
可以具有几种有效的编码,而bytes
对象可以 是有效的Unicode字符串的编码。 (或者,bytes
可以是多个不同 str
对象的编码,具体取决于创建它的编码。)
'GET '
和user_url
是str
对象,而' HTTP/1.0\r\n\r\n'.encode()
是bytes
对象。您想编码整个串联的字符串。
cmd = 'GET {} HTTP/1.0\r\n\r\n'.format(user_url).encode()
或者写成更清楚地显示步骤
cmd = 'GET {} HTTP/1.0\r\n\r\n'.format(user_url) # still a str
mysock.send(cmd.encode()) # send the encoding of the str
答案 1 :(得分:0)
问题是您要在连接之前进行编码:
'GET ' + user_url + ' HTTP/1.0\r\n\r\n'.encode()
您必须先进行连接,然后再对整个内容进行编码:
('GET ' + user_url + ' HTTP/1.0\r\n\r\n').encode()