zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    微博Feed流
    朋友圈
    Go命令行—compile
    Practical Go: Real world advice for writing maintainable Go programs
    Nginx Cache-Control
    Redis 主从复制
    JAVA
    Tomcat
    Tomcat
    CentOS 7
  • 原文地址:https://www.cnblogs.com/tanglie/p/10066637.html
Copyright © 2011-2022 走看看