Python简易文件服务器程序始终提示文件不存在问题排查求助
解决Python简易文件服务器中文件存在性检查失败的问题
嘿,我瞅你写这个简易文件服务器的时候,卡在文件存在性检查这一步了——每次都提示文件不存在,对吧?帮你捋了一遍代码,发现两个核心问题,咱们一个个来 fix:
问题1:参数被错误覆盖
你定义的RetFile函数明明接收了FileName参数,但函数第一行就写了FileName = sock.recv(1024),直接把传入的文件名给覆盖了!这相当于你完全没用到一开始传进来的文件名,反而去接收客户端的消息作为文件名(如果这是你的设计,那没问题,但得处理下面的编码问题)。
问题2:字节串未解码成字符串
sock.recv(1024)返回的是字节对象(bytes),但os.path.isfile()需要的是字符串格式的文件路径。你直接把字节串传给它,系统自然识别不了对应的文件。
修正后的代码示例
import socket import threading import os def RetFile(sock): # 接收客户端发来的文件名,解码成字符串并去除多余空白符 file_name = sock.recv(1024).decode('utf-8').strip() print(f"尝试查找文件:{file_name}") # 调试用,确认接收的文件名是否正确 exists = os.path.isfile(file_name) if exists: file_size = os.path.getsize(file_name) sock.send(f"EXISTS {file_size}".encode('utf-8')) # 接收客户端的确认指令 user_response = sock.recv(1024).decode('utf-8').strip() if user_response[:2] == "OK": with open(file_name, 'rb') as f: # 分块发送文件内容 while chunk := f.read(1024): sock.send(chunk) print("文件发送完成") else: sock.send("NOT_EXISTS".encode('utf-8')) print(f"文件 {file_name} 不存在") # 补充服务器启动的基础代码(你原代码未写完的部分) def handle_client(client_sock): try: RetFile(client_sock) finally: client_sock.close() def start_server(): host = '0.0.0.0' port = 12345 server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_sock.bind((host, port)) server_sock.listen(5) print(f"服务器启动,监听 {host}:{port}") while True: client_sock, addr = server_sock.accept() print(f"接收到来自 {addr} 的连接") threading.Thread(target=handle_client, args=(client_sock,)).start() if __name__ == "__main__": start_server()
额外调试小技巧
- 加上
print(f"接收的文件名:{file_name},类型:{type(file_name)}"),确认你拿到的文件名是不是正确的字符串,有没有多余的换行/空格字符。 - 检查文件路径:如果客户端传的是相对路径,要确保服务器程序的工作目录下确实有这个文件,或者改用绝对路径来做存在性检查。
内容的提问来源于stack exchange,提问作者cleanrun
相关产品推荐
相关产品推荐

