报错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。
修复方案
- 直接使用循环变量
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")
- 优化字节与字符串的转换方式(可选但推荐)
你当前用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
相关产品推荐
相关产品推荐

