Python HTTP服务器在一段时间后出现错误

Python HTTP服务器在一段时间后出现错误,python,python-3.x,sockets,http,tcp,Python,Python 3.x,Sockets,Http,Tcp,我编写了一个Python HTTP服务器,如下所示,并从该Python文件所在的目录运行该服务器。我在cmd中键入“python myserver.py”,服务器成功启动并读取目录中的index.html,但问题是一段时间后,我的代码出现以下错误并关闭服务器 回溯(最近一次呼叫最后一次): 文件“myserver.py”,第20行,在 请求\u文件=字符串\u列表[1] 索引器:列表索引超出范围 我如何解决这个问题 import socket HOST,PORT = '127.0.0.1',8

我编写了一个Python HTTP服务器,如下所示,并从该Python文件所在的目录运行该服务器。我在cmd中键入“python myserver.py”,服务器成功启动并读取目录中的index.html,但问题是一段时间后,我的代码出现以下错误并关闭服务器

回溯(最近一次呼叫最后一次): 文件“myserver.py”,第20行,在 请求\u文件=字符串\u列表[1] 索引器:列表索引超出范围

我如何解决这个问题

import socket

HOST,PORT = '127.0.0.1',8082

my_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
my_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
my_socket.bind((HOST,PORT))
my_socket.listen(1)

print('Serving on port ',PORT)

while True:
    connection,address = my_socket.accept()
    request = connection.recv(1024).decode('utf-8')
    string_list = request.split(' ')     # Split request from spaces

    print (request)

    method = string_list[0]
    requesting_file = string_list[1]

    print('Client request ',requesting_file)

    myfile = requesting_file.split('?')[0] # After the "?" symbol not relevent here
    myfile = myfile.lstrip('/')
    if(myfile == ''):
        myfile = 'index.html'    # Load index file as default

    try:
        file = open(myfile,'rb') # open file , r => read , b => byte format
        response = file.read()
        file.close()

        header = 'HTTP/1.1 200 OK\n'

        if(myfile.endswith(".jpg")):
            mimetype = 'image/jpg'
        elif(myfile.endswith(".css")):
            mimetype = 'text/css'
        else:
            mimetype = 'text/html'

        header += 'Content-Type: '+str(mimetype)+'\n\n'

    except Exception as e:
        header = 'HTTP/1.1 404 Not Found\n\n'
        response = '<html><body><center><h3>Error 404: File not found</h3><p>Python HTTP Server</p></center></body></html>'.encode('utf-8')

    final_response = header.encode('utf-8')
    final_response += response
    connection.send(final_response)
    connection.close()
导入套接字
主机,端口='127.0.0.1',8082
my_socket=socket.socket(socket.AF\u INET,socket.SOCK\u STREAM)
my_socket.setsockopt(socket.SOL_socket,socket.SO_REUSEADDR,1)
my_socket.bind((主机、端口))
我的插座。听(1)
打印('在端口上服务',端口)
尽管如此:
连接,地址=my_socket.accept()
请求=connection.recv(1024).解码('utf-8')
string_list=request.split(“”)#从空格分割请求
打印(请求)
方法=字符串\u列表[0]
请求\u文件=字符串\u列表[1]
打印('客户请求',请求\u文件)
myfile=请求_file.split(“?”)[0]#在“?”符号之后,此处不相关
myfile=myfile.lstrip(“/”)
如果(myfile=''):
myfile='index.html'#默认加载索引文件
尝试:
file=open(myfile,'rb')#openfile,r=>read,b=>byte格式
response=file.read()
file.close()文件
标头='HTTP/1.1 200正常\n'
如果(myfile.endswith(“.jpg”):
mimetype='image/jpg'
elif(myfile.endswith(“.css”):
mimetype='text/css'
其他:
mimetype='text/html'
标题+='内容类型:'+str(mimetype)+'\n\n'
例外情况除外,如e:
标头='HTTP/1.1 404未找到\n\n'
响应='Error 404:File not foundPython HTTP Server

'。编码('utf-8') 最终响应=报头编码('utf-8') 最终响应+=响应 连接发送(最终响应) 连接。关闭()

不能保证一次读取消息的整个n字节,并且在某些情况下返回的字节数可能少于请求的字节数

关于您的代码,可能只接收
方法
或其一部分,而接收的数据中不存在任何空格字符。在这种情况下,
split()

解决方案是检查是否已收到完整消息。您可以通过循环直到接收到足够的数据来实现这一点,例如,您可以通过检查数据长度并循环直到达到最小值来确保已接收到一些最小字节数

或者,您可以继续阅读,直到收到新行或其他哨兵字符。限制传入数据的长度可能是值得的,以避免您的服务器被来自恶意客户端的数据淹没


最后,检查
split()。此外,要非常小心文件名;如果它包含一个相对路径,例如,
。/../etc/passwd

可能
string\u list
只有一个元素。我通过添加if not request来解决问题:35; time.sleep(0.01)continue@erkevarol:只有当客户端关闭连接而不发送任何数据时,该解决方案才会起作用。仍然可能会收到截断的消息。