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

时间:2017-06-03 14:12:43

标签: python python-3.x sockets

我在使用Python的RaspberryPi上的UCI Coursera course

视频讲座的代码似乎有些错误。这是讲座视频中的代码,逐字:

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'

我必须想象教师的代码接近正确,但其中有一些小错字或其他东西。所以我试图弄清楚他们的写作意图以及为什么会有所不同,因此将此类错误视为字符串。

我会直接在课程中跟进,但遗憾的是这个没有讨论论坛,所以我们将非常感谢您的帮助。

4 个答案:

答案 0 :(得分: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 :(得分:0)

如果查看socket documentation,可以看到sendall需要发送字节。 Python有一个内置函数将String转换为字节,称为encode。所以,你必须使用

mysock.sendall(message.encode()) 

将其转换为字节,以便发送。

答案 2 :(得分:0)

在通过套接字发送消息之前对其进行编码。

sc.send(message.encode())
收到解码后

message.decode()

你们已经完成了

答案 3 :(得分:0)

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