提问人:Hack-R 提问时间:6/3/2017 最后编辑:Hack-R 更新时间:11/2/2018 访问量:9561
套接字 sendall() 方法抛出 TypeError:需要类似字节的对象,而不是 'str'
Socket sendall() method throws TypeError: a bytes-like object is required, not 'str'
问:
我正在参加 RaspberryPi 的 UCI Coursera 课程,该课程使用 Python。
视频讲座的代码中似乎存在一些错误。这是讲座视频中的代码,逐字逐句:
import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname("www.google.com")
mysock.connect(host, 80)
message = "GET / HTTP/1.1\r\n\r\n"
mysock.sendall(message)
data=mysock.recv(1000)
mysock.close()
我能够修复一个错误,即只接受一个参数,一个元组,所以它应该而不是..connect()
mysock.connect((host, 80))
mysock.connect(host, 80)
但是,示例值似乎存在类型错误。当我运行时,它会抛出:message
mysock.sendall(message)
TypeError:需要类似字节的对象,而不是“str”
我不得不想象讲师的代码接近正确,但其中有一些小错别字之类的。所以我试图弄清楚他们写什么以及为什么这不同,因此将这种类型错误抛出为字符串。
我会直接在课程中跟进,但不幸的是,这个课程没有讨论论坛,所以这里的任何帮助将不胜感激。
答:
3赞
WholesomeGhost
6/3/2017
#1
import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname("www.google.com")
mysock.connect((host, 80))
message = "GET / HTTP/1.1\r\n\r\n"
mysock.sendall(message.encode())
data=mysock.recv(1000)
mysock.close()
只需添加编码即可。
评论
1赞
Hack-R
6/3/2017
谢谢,是的,我刚刚测试了它,这很有效!另外,让我赞扬@Cycloencode在评论中提到这一点。一旦有足够的时间过去,我会将这个答案标记为解决方案。
0赞
Rens Oliemans
6/3/2017
#2
如果你看一下套接字文档,你可以看到 sendall 需要发送字节。Python 有一个内置函数,用于将 String 转换为字节,称为 encode。所以,你必须使用
mysock.sendall(message.encode())
将其转换为字节,以便发送。
0赞
Bibek Ghimire
6/3/2017
#3
在通过套接字发送消息之前对其进行编码。
sc.send(message.encode())
收到解码后:
message.decode()
你们都完成了
0赞
shathathrahman
11/2/2018
#4
import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostbyname("www.google.com")
mysock.connect((host, 80))
message = b"GET / HTTP/1.1\r\n\r\n"
mysock.sendall(message)
data=mysock.recv(1000)
mysock.close()
评论
mysock.sendall(message.encode())
或者也许 ?mysock.sendall(b(message))