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

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判断逻辑,会被判定为无效请求。
修复方案
  1. 调整逻辑匹配预期目标:不需要读本地图片文件,直接按HTTP协议格式构造包含datatatata的响应即可。
  2. 修正路径写法:如果后续需要读本地文件,路径字符串加r前缀标记为原始字符串,避免反斜杠转义问题,比如r"C:\Users\hadad\Desktop\webroot\imgs\"。
  3. 补全异常处理:读文件、处理请求的逻辑加try/except捕获,文件不存在时返回404响应,避免服务直接崩溃。
  4. 修正请求解析逻辑:正确提取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:48:28