我正在尝试使用套接字连接到FTP服务器。我在学习网络编程,所以我不想使用ftplib。我搜索了stackoverflow的所有地方,因为有类似的问题,我尝试了解决方案堆栈用户必须提供的一切,但到目前为止没有一个有效。知道怎么回事吗?你知道吗
def connect_to_target(username, password):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((target, 21))
data = s.recv(1024).decode()
s.send('USER' + username + '\r\n').encode()
data = s.recv(1024).decode()
s.send('PASS' + password + '\r\n').encode()
data = s.recv(3).decode()
s.send('QUIT\r\n')
s.close()
return data
翻译说问题出在第13行
s.send('USER' + username + '\r\n').encode().
我试过一种不同的方法,比如:
s.send('USER' + username + '\r\n'.encode())
当我尝试后者时,它给了我:
TypeError: Can't convert 'bytes' object to str implicitly
s.send()
需要一个编码字节流作为参数。所以你想要像s.send(str.encode())
这样的东西。你知道吗当你这么做的时候
不是对字符串进行编码,而是对
s.send()
的返回值进行编码。它读起来像s.send(str).encode()
,这不是你想要的。你知道吗你的第二次尝试更接近我们应该有的,但在这种情况下,你没有注意到运算符的优先级。你知道吗
这与首先执行
'\r\n'.encode()
,然后将字符串(username
)与不允许的bytes对象('\r\n'.encode()
)连接在一起是一样的。这个表达式的形式是s.send(str2 + str.encode())
,其中.
运算符的优先级高于+
运算符,就像数学中加法之前先乘法一样。你知道吗您希望对整个字符串进行编码。您这样做的方式只编码字符串的
'\r\n'
部分。你知道吗因此,需要用括号将字符串串联起来,以便在编码之前首先执行串联。因此,您需要:
这就是我们之前期望的
s.send(str.encode())
形式。你知道吗对于这条线
您调用
encode
就像它是从s.send
返回的任何内容的方法一样,这可能不是您想要的。你知道吗对于这条线
您只对序列中的最后一个字符串调用encode
由于其中一个字符串已编码(到
bytes
类型),而其他字符串仍然是正常的str
类型,因此结果串联将不起作用。你知道吗为了让它工作,你需要创建一个包含整个批次的字符串,然后
encode
。你知道吗由于
+
运算符的原因,将在不创建任何临时字符串的情况下执行此操作。你知道吗相关问题 更多 >
编程相关推荐