• Python Socket 遇到错误: TypeError: a bytes-like object is required, not 'str'


    错误TypeError: a bytes-like object is required, not 'str'

    运行环境:python 3.6.7 + pythoncharm

      错误:TypeError: a bytes-like object is required, not 'str'

      错误原因:从字面意思已经说明是“需要一个字节类型的数据,而不是一个String类型”,反复找了才发现是我使用send()发送数据时候不能直接填写字符串,需要转成字节类型才行。

      格外说下:

          encode()

          decode()两个方法的使用encode()是可以将String类型的数据转化成字节类型的。而decode()是将字节型转化为String类型里面带参数字符偏码。

      解决办法:

      客户端正确代码:

    # encoding=utf8
    from socket import *
    from threading import *
    from time import *
    #方法区域
    def receive_msg():
        print('发送消息方法')
    
    def get_host_ip():
        try:
            s = socket(family=AF_INET,type=SOCK_DGRAM)
            s.connect(('8.8.8.8',80))
            ip = s.getsockname()[0]
        finally:
            s.close()
        return ip
    #客户端
    def ClientMain():
        host = get_host_ip()
        print(host)
        prot = 8888
        address = (host, prot)
        # 客户端
        clientSocket = socket(family=AF_INET,type=SOCK_STREAM)
        # 连接到服务器
        clientSocket.connect(address)
        # # 创建线程
        # t = Thread(target=receive_msg, args=('唐烈', clientSocket))
        # # 启动线程
        # t.start()
        str = "客户端测试数据"
        # encode()返回是一个bytes类型的数据,发送时候发的是字节流所以不能直接发String
        clientSocket.send(str.encode())
        data = clientSocket.recv(1024).decode(encoding='utf-8')
    
        print('服务端数据:' + str)
    
    if __name__ == '__main__':
        ClientMain()

      错误代码:

    "D:softwae installPythonInsertpython3.6.7python.exe" "G:/Learning software/Test/Client.py"
    Traceback (most recent call last):
      File "G:/Learning software/Test/Client.py", line 39, in <module>
        ClientMain()
      File "G:/Learning software/Test/Client.py", line 33, in ClientMain
        clientSocket.send(str)
    TypeError: a bytes-like object is required, not 'str'

      相关代码:

      客户端错误代码:

    # encoding=utf8
    from socket import *
    from threading import *
    from time import *
    #方法区域
    def receive_msg():
        print('发送消息方法')
    
    def get_host_ip():
        try:
            s = socket(family=AF_INET,type=SOCK_DGRAM)
            s.connect(('8.8.8.8',80))
            ip = s.getsockname()[0]
        finally:
            s.close()
        return ip
    #客户端
    def ClientMain():
        host = get_host_ip()
        print(host)
        prot = 8888
        address = (host, prot)
        # 客户端
        clientSocket = socket(family=AF_INET,type=SOCK_STREAM)
        # 连接到服务器
        clientSocket.connect(address)
        # # 创建线程
        # t = Thread(target=receive_msg, args=('唐烈', clientSocket))
        # # 启动线程
        # t.start()
        str = "客户端测试数据"
        # encode()返回是一个bytes类型的数据,发送时候发的是字节流所以不能直接发String
        clientSocket.send(str)
        data = clientSocket.recv(1024).decode(encoding='utf-8')
    
        print('服务端数据:' + str)
    
    if __name__ == '__main__':
        ClientMain()
  • 相关阅读:
    【Oracle】ORA-00257:archiver error. Connect internal only, until freed 错误的处理方法
    【SQL】区分新来顾客和再访顾客
    【Xcelsius】在PPT中嵌入水晶易表Xcelsius2008仪表盘
    【SAP BO】【WEBI】【转】Webi实现动态选择度量
    【转】Xcelsius2008 水晶易表问题 部分汇总
    如何进行有效的需求调研
    实现数据仓库的七个步骤、七个禁忌、七种思路
    UTC日期转时间戳
    WIN10下命令行禁用编辑模式
    让socket端口不被子进程继承
  • 原文地址:https://www.cnblogs.com/tanglie/p/10066637.html
Copyright © 2020-2023  润新知