只能将 str (不是“字节”)连接到 str

Pha*_*181 20 python string byte python-3.x

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()
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我开始犯这个错误

输入网址: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
Run Code Online (Sandbox Code Playgroud)

任何想法我做错了什么?编码和解码对我来说似乎是正确的,我已经在 .encode() 之前使用 \n 传输它。这是一个班级

che*_*ner 14

Astr是 Unicode 代码点的抽象序列;abytes是一个 8 位数字的序列。Python 3 非常清楚地区分了两者,并且不允许您隐式地将它们组合起来。甲str可能有几个有效的编码,和一个bytes对象可以或可以不一个有效的Unicode字符串的编码。(或者,这bytes可能是多个不同 str对象的编码,具体取决于用于创建它的编码。)

'GET 'anduser_urlstr对象,而 while' HTTP/1.0\r\n\r\n'.encode()bytes对象。您想对整个连接的字符串进行编码。

cmd = 'GET {} HTTP/1.0\r\n\r\n'.format(user_url).encode()
Run Code Online (Sandbox Code Playgroud)

或者也许是为了更清楚地显示步骤而写的,

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
Run Code Online (Sandbox Code Playgroud)


Ara*_*Fey 8

问题是您在连接之前进行编码:

'GET ' + user_url + ' HTTP/1.0\r\n\r\n'.encode()
Run Code Online (Sandbox Code Playgroud)

您必须首先连接,然后对整个内容进行编码:

('GET ' + user_url + ' HTTP/1.0\r\n\r\n').encode()
Run Code Online (Sandbox Code Playgroud)