套接字 sendall() 方法抛出 TypeError:需要类似字节的对象,而不是 'str'

Socket sendall() method throws TypeError: a bytes-like object is required, not 'str'

提问人:Hack-R 提问时间:6/3/2017 最后编辑:Hack-R 更新时间:11/2/2018 访问量:9561

问:

我正在参加 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)

但是,示例值似乎存在类型错误。当我运行时,它会抛出:messagemysock.sendall(message)

TypeError:需要类似字节的对象,而不是“str”

我不得不想象讲师的代码接近正确,但其中有一些小错别字之类的。所以我试图弄清楚他们写什么以及为什么这不同,因此将这种类型错误抛出为字符串。

我会直接在课程中跟进,但不幸的是,这个课程没有讨论论坛,所以这里的任何帮助将不胜感激。

python-3.x 套接字

评论

0赞 Cyclonecode 6/3/2017
mysock.sendall(message.encode())或者也许 ?mysock.sendall(b(message))
0赞 Bibek Ghimire 6/3/2017
在发送时对消息进行编码:message.encode() 并在收到 message.decode() 后对其进行解码怎么办。
0赞 Hack-R 6/3/2017
谢谢,是的,这似乎有效
0赞 President James K. Polk 6/4/2017
课程材料可能假设 python2,而您使用的是 python3。你真的应该适当地用 python2 或 3 标记你的问题。
0赞 Hack-R 6/4/2017
他使用 3;我添加了一个标签,谢谢

答:

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()