【问题标题】:TypeError: a bytes-like object is required, not 'str' when writing to a fileTypeError:写入文件时需要一个类似字节的对象,而不是'str'
【发布时间】:2018-08-16 15:45:24
【问题描述】:
import socket

def Main():
    host = '127.0.0.1'
    port = 5001

    server = ('127.0.0.1',5000)

    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.bind((host, port))

    message = input("-> ")
    while message != 'q':
        s.sendto (message, server)
        data, addr = s.recvfrom(1024)
        print ('Received from server: ' + (data))
        message = input("-> ")
    s.close()

if __name__ == '__main__':
    Main()

当我运行此代码时,s.sendto (message, server) 行会导致 TypeError: a bytes-like object is required, not 'str'

您如何解决此类问题?我尝试搜索互联网,但找不到解决方案。

【问题讨论】:

标签: python python-3.x sockets


【解决方案1】:

套接字读取和写入字节,而不是字符串(这通常是套接字的属性,而不是特定于 python 的实现选择)。这就是错误的原因。

字符串有一个encode() 方法可以将它们转换为字节对象。所以,不要写my_text,而是写my_text.encode()到你的socket。

同样,当你读取套接字时,你会得到一个类似字节的对象,你可以在其上调用input_message.decode() 将其转换为字符串

【讨论】:

  • 感谢您的帮助,我按照您说的做了,问题解决了
  • @Firaga:谢谢,如果解决了问题请采纳
【解决方案2】:

错误是由于您没有对消息进行编码。 只需更改:

c.sendto(message, server)

c.sendto(message.encode(), server)

在您的代码中。

示例:

    import  socket
    
    s=socket.socket()
    port=12345
    s.bind(('',port))
    print("Socket bind succesfully")
    s.listen(5)
    // note this point 
    message="This is message send to client "
    
    while True:
        c,addr=s.accept()
        // here is error occured 
        c.send(message)
        c.close()

这将导致错误消息:

    c.send(message)
    TypeError: a bytes-like object is required, not 'str'

为了修复它,我们需要改变:

c.send(message)

c.send(message.encode())

【讨论】:

    猜你喜欢
    • 2016-01-08
    • 2016-01-05
    相关资源
    最近更新 更多