Python Socket服务器运行报[Errno 2] FileNotFoundError错误排查
问题描述
编写了一款仅实现基础功能的Socket服务器,预期设计目标是向访问的浏览器返回包含字符串datatatata的响应数据包,但程序运行出现异常:启动服务后通过浏览器发起HTTP请求访问时,持续抛出[Errno 2]错误。
服务端实现代码
import socket # functions def get_file_data(filename): pass def handle_client_request(file_path, client_socket): file_to_return = open(file_path, 'rb') file_content = file_to_return.read() client_socket.send(file_content) def validate_client_request(client_request): # checks validation of request. for now validation is set to true validation = True # checks for requested URL desired_file_name = "" for i in client_request[5::]: if i != " ": desired_file_name += i else: break # checking file type file_type = "" if desired_file_name == "favicon": file_type = "ico" elif desired_file_name == "abstruct" or desired_file_name == "": file_type = "jpg" elif desired_file_name == "loading": file_type = "gif" if file_type == "": validation = False file_path = "C:\Users\hadad\Desktop\webroot\imgs\" + desired_file_name + "." + file_type return validation, file_path def handle_client(client_socket): client_request = client_socket.recv(1024).decode() valid_request, file_path = validate_client_request(client_request) if valid_request: handle_client_request(file_path, client_socket) else: client_socket.send("unvalid request. connection ended".encode()) client_socket.close() def main(): server_socket = socket.socket() server_socket.bind(("0.0.0.0", 80)) server_socket.listen() # everlasting loop while True: client_socket, client_address = server_socket.accept() handle_client(client_socket) if __name__ == '__main__': main()
运行报错信息
Traceback (most recent call last): File "C:/Networks/hed/good_server.py", line 64, in <module> main() File "C:/Networks/hed/good_server.py", line 60, in main handle_client(client_socket) File "C:/Networks/hed/good_server.py", line 46, in handle_client handle_client_request(file_path, client_socket) File "C:/Networks/hed/good_server.py", line 11, in handle_client_request file_to_return = open(file_path, 'rb') FileNotFoundError: [Errno 2] No such file or directory: 'C:\Users\hadad\Desktop\webroot\imgs\abstruct.jpg'
从报错栈可见,错误触发于文件读取环节,程序提示指定路径下不存在abstruct.jpg文件。
问题根因
报错只是表面现象,代码里一共有3类问题:
- 直接触发报错的原因:代码硬编码把根路径(也就是浏览器访问
http://服务器ip/时的路径)映射到abstruct.jpg文件,但本地C:\Users\hadad\Desktop\webroot\imgs\目录下根本没有这个文件,调用open()读文件时自然抛出找不到文件的错误。 - 路径写法存在隐患:Windows路径里的反斜杠在Python字符串中是转义符,直接写
"C:\Users\hadad\Desktop\webroot\imgs\"没有做转义处理,就算文件存在,也可能因为转义序列解析错误导致路径不对。 - 逻辑与预期目标偏离、不符合HTTP协议规范:预期是返回
datatatata字符串,但现有逻辑是去读本地图片文件;而且就算文件存在,直接把文件二进制内容发给浏览器,没有按HTTP协议格式组装响应(缺少状态行、响应头、空行分隔符),浏览器也无法正常识别内容。另外请求路径解析逻辑也有bug,比如浏览器自动请求的/favicon.ico会被解析成favicon.ico,匹配不到写的favicon判断逻辑,会被判定为无效请求。
修复方案
- 调整逻辑匹配预期目标:不需要读本地图片文件,直接按HTTP协议格式构造包含
datatatata的响应即可。 - 修正路径写法:如果后续需要读本地文件,路径字符串加
r前缀标记为原始字符串,避免反斜杠转义问题,比如r"C:\Users\hadad\Desktop\webroot\imgs\"。 - 补全异常处理:读文件、处理请求的逻辑加try/except捕获,文件不存在时返回404响应,避免服务直接崩溃。
- 修正请求解析逻辑:正确提取HTTP请求行里的路径,处理浏览器自动发起的favicon请求。
最小可运行修正代码(符合返回datatatata的预期)
import socket def handle_client(client_socket): # 接收浏览器请求 client_request = client_socket.recv(1024).decode() if not client_request: client_socket.close() return # 构造HTTP响应,返回目标字符串 response_body = b"datatatata" response = b"HTTP/1.1 200 OK\r\n" response += b"Content-Type: text/plain; charset=utf-8\r\n" response += f"Content-Length: {len(response_body)}\r\n".encode() response += b"Connection: close\r\n" response += b"\r\n" response += response_body client_socket.send(response) client_socket.close() def main(): server_socket = socket.socket() # 加端口复用配置,避免重启时提示端口占用 server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_socket.bind(("0.0.0.0", 80)) server_socket.listen() while True: client_socket, client_address = server_socket.accept() handle_client(client_socket) if __name__ == '__main__': main()
运行这段代码后,浏览器访问对应服务器IP的80端口,就能正常看到datatatata文本,不会再抛出文件找不到的错误。
内容的提问来源于stack exchange,提问作者tony
相关产品推荐
相关产品推荐

