繁体   English   中英

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

[英]Python HTTP server giving error some time after

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

追溯(最近一次呼叫最近):requesting_file = string_list [1]中的文件“ myserver.py”,第20行,IndexError:列表索引超出范围

我该如何解决这个问题?

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()

不保证socket.recv(n)读取消息的整个n个字节,并且在某些情况下返回的字节数可能少于请求的字节数。

关于您的代码,有可能仅接收到method或其一部分,而接收到的数据中没有任何空格字符。 在这种情况下, split()将返回一个包含一个元素的列表,而不是您假设的两个元素。

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

或者,您可以继续阅读,直到收到新行或其他一些前哨字符。 最好限制传入数据的长度,以避免服务器被流氓客户端的数据淹没。

最后,检查split()是否返回您期望的两个值,如果没有,则进行相应的处理。 此外,请注意文件名; 如果它包含相对路径,例如../../etc/passwd怎么../../etc/passwd

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM