2017-06-03 141 views
0

我在使用Python的RaspberryPi的UCI Coursera course中。Socket sendall()方法抛出TypeError:需要类似字节的对象,而不是'str'

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

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: a bytes-like object is required, not 'str'

我有想象,教师的代码是紧挨是正确的,但有一些小错字在里面,什么的。所以我想弄清楚它们的意思是什么,以及为什么这是不同的,因此将这种类型的错误作为一个字符串引发。

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

+0

'mysock.sendall(message.encode())'或'也许mysock.sendall(B(消息)) '? – Cyclonecode

+0

如何在发送时编码消息:message.encode()并在接收message.decode()后解码。 –

+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

谢谢,是的,我刚刚测试过它,它的工作原理!同样让我赞扬@Cycloencode在评论中提到这一点。一旦足够的时间过去,我会将这个答案标记为解决方案。 –

0

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

mysock.sendall(message.encode()) 

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

0

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

sc.send(message.encode()) 

接收解码之后:

message.decode() 

你都做

相关问题