Python3.6 TCP/IP通信中encode()与decode()的使用位置咨询
Python3.6 Socket 数据收发中 decode() 的正确用法
嘿,我完全懂你在Python3.6下做跨笔记本socket数据传输时的困惑——毕竟Python2和3在字节串(bytes)与字符串(str)的处理逻辑上差得挺多的!之前Python2里socket直接收发字符串,到了Python3必须手动做编码转换,这确实容易搞混位置。
核心逻辑先搞清楚
Python3中,socket的recv()方法返回的是bytes类型的数据,而不是字符串。如果你要把这些数据当普通文本(比如文件名、指令)来处理,就必须用.decode()把它转换成字符串;反过来,当你要发送字符串时,得先用.encode()把它转成bytes才能通过socket发送。
你的服务端代码里,decode()该用在这些地方
结合你给出的RetrFile函数片段,我给你补全并标注出decode的正确位置:
import socket import threading import os def RetrFile(name, sock): # 1. 接收客户端发来的文件名:recv返回bytes,必须decode成字符串才能用 filename_bytes = sock.recv(1024) filename = filename_bytes.decode('utf-8') # 这里就是decode的核心位置! # 检查文件是否存在 if os.path.exists(filename): # 2. 发送文件存在的确认信息:字符串需要先encode成bytes再发送 file_size = os.path.getsize(filename) sock.send(f"EXISTS {file_size}".encode('utf-8')) # 3. 接收客户端的准备就绪指令:同样要decode成字符串判断 client_ready = sock.recv(1024).decode('utf-8') if client_ready == "READY": # 发送文件内容:如果是二进制文件(图片、exe等),用rb模式读取直接发bytes with open(filename, 'rb') as f: while True: chunk = f.read(1024) if not chunk: break sock.send(chunk) # 二进制数据无需encode/decode print(f"文件 {filename} 发送完成") else: # 发送文件不存在的提示:字符串转bytes发送 sock.send("NOT_EXISTS".encode('utf-8'))
几个关键提醒
- 编码格式要统一:服务端用
utf-8解码/编码,客户端也必须用同样的格式,不然会出现乱码或者解码错误。 - 二进制文件无需编码转换:如果传输的是图片、视频这类二进制文件,全程用
rb(读二进制)、wb(写二进制)模式操作,直接收发bytes即可,不用调用decode()或encode()。 - 大文件要循环收发:不管是收还是发,单次
recv()只能获取部分数据,必须循环处理直到完成。
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

