【问题标题】:Socket sendall() method throws TypeError: a bytes-like object is required, not 'str'套接字 sendall() 方法抛出 TypeError: a bytes-like object is required, not 'str'
【发布时间】:2017-11-04 19:16:20
【问题描述】:

我在使用 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'

我不得不想象讲师的代码几乎是正确的,但其中有一些小错字,或者其他什么。所以我试图弄清楚他们要写什么以及为什么这是不同的,因此会将此类型错误作为字符串抛出。

我会直接在课程中跟进,但很遗憾,这个课程没有讨论论坛,因此我们将不胜感激。

【问题讨论】:

  • mysock.sendall(message.encode()) 或者mysock.sendall(b(message))?
  • 发送时如何编码消息:message.encode() 并在接收到 message.decode() 后对其进行解码。
  • 谢谢,是的,这似乎有效
  • 很可能课程材料假定使用python2,而您使用的是python3。您确实应该根据需要使用 python2 或 3 标记您的问题。
  • 他使用 3;我添加了一个标签谢谢

标签: python python-3.x sockets


【解决方案1】:
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()

【讨论】:

    【解决方案2】:

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

    sc.send(message.encode())
    

    收到解码后:

    message.decode()
    

    你已经完成了

    【讨论】:

      【解决方案3】:

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

      mysock.sendall(message.encode()) 
      

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

      【讨论】:

        【解决方案4】:
        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()
        

        只需添加编码。

        【讨论】:

        • 谢谢,是的,我刚刚测试了它,并且有效!还让我感谢@Cycloencode 在评论中提到这一点。一旦经过足够的时间,我会将此答案标记为解决方案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-08
        • 2019-09-24
        • 1970-01-01
        • 2018-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多