只能将str(而不是“ bytes”)连接到str

时间:2019-03-06 22:43:57

标签: python python-3.x string byte

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进行了编码和解码。 这是一堂课

2 个答案:

答案 0 :(得分:2)

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

'GET 'user_urlstr对象,而' 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()
相关问题