You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

报错TypeError: decoding str is not supported,求排查Python网络通信代码问题

解决 TypeError: decoding str is not supported 错误

我帮你定位到了问题的根源,这个错误是典型的类型转换误用导致的——你对已经是字符串类型的变量,错误地使用了str()函数的解码参数。

具体出错点分析

看你代码的最后一行:

print(strftime("%Y-%m-%d %H:%M:%S", gmtime())+" "+str(name, 'utf-8')+ " is connected")

这里的name是循环for name in self.name_list里的变量,而self.name_list中的元素是你之前已经转成字符串的内容:

self.name_list.append(str(name, 'utf-8'))  # 这里已经把字节流转成字符串了

循环里的name本身就是字符串类型,此时再用str(name, 'utf-8')就会触发错误——因为str()的第二个编码参数只适用于字节流转字符串的场景,给字符串传这个参数就会报decoding str is not supported。

修复方案

  1. 直接使用循环变量name
    把最后一行代码改成:
print(f"{strftime('%Y-%m-%d %H:%M:%S', gmtime())} {name} is connected")

如果习惯用字符串拼接,也可以写成:

print(strftime("%Y-%m-%d %H:%M:%S", gmtime()) + " " + name + " is connected")
  1. 优化字节与字符串的转换方式(可选但推荐)
    你当前用str(bytes_obj, 'utf-8')和bytes(str_obj, 'utf-8')来转换类型,建议换成更直观的方法,降低出错概率:
  • 字节转字符串:用decode('utf-8'),比如:
    name = c.recv(1024).decode('utf-8')
    self.name_list.append(name)
    
  • 字符串转字节:用encode('utf-8'),比如:
    c.send(str(num_g).encode('utf-8'))
    

修复后的完整代码片段

def run(self):
    while True:
        c, a = self.sock.accept()
        print(c)
        # 优化字节转字符串
        name = c.recv(1024).decode('utf-8')
        people = ""
        self.name_list.append(name)
        num_g = len(self.name_list)
        # 优化字符串转字节
        c.send(str(num_g).encode('utf-8'))
        print(str(num_g))
        data = c.recv(1024).decode('utf-8')
        print(data)
        if data == "ok":
            for name in self.name_list:
                print(name)
                c.send(name.encode('utf-8'))
            print(len(self.name_list))
            # 修复最后一行的错误
            print(f"{strftime('%Y-%m-%d %H:%M:%S', gmtime())} {name} is connected")

内容的提问来源于stack exchange,提问作者HI YUM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:43:01