我在使用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'
我必须想象教师的代码接近正确,但其中有一些小错字或其他东西。所以我试图弄清楚他们的写作意图以及为什么会有所不同,因此将此类错误视为字符串。
我会直接在课程中跟进,但遗憾的是这个没有讨论论坛,所以我们将非常感谢您的帮助。
答案 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()