我在一个HTTP服务器上工作,它给出了一个错误,索引是离开数组
朋友们,请帮帮我!
代码如下:
import socket
#Make a socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(("0.0.0.0", 8080))
sock.listen(1)
#Handling requests
while True:
#listening for client
client, address = sock.accept()
try:
#reads file from response and makes a response
client.send(str(f"HTTP/1.1 200 OK nn{open(f'.{client.recv(1024).decode().splitlines()[0].split()[1]}', 'rb').read()}").encode('utf-8'))
#HTTP Response 404
except FileNotFoundError:
client.send("HTTP/1.1 404 Not Found".encode("utf-8"))
错误如下:
Traceback (most recent call last):
File "/data/data/com.termux/files/home/SimpleHTTP/Generic/main.py", line 12, in <module>
client.send(str(f"HTTP/1.1 200 OK nn{open(f'.{client.recv(1024).decode().splitlines()[0].split()[1]}', 'rb').read()}").encode('utf-8'))
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^
IndexError: list index out of range
错误消息表明列表索引超出范围,这意味着您正在尝试访问列表中不存在的元素。当您试图从客户端分离接收到的消息时,会发生这种情况:
client.recv(1024).decode().splitlines()[0].split()[1]
客户端可能没有发送有效的HTTP请求,因此消息没有被正确分割。在尝试访问分割列表中的第二个元素之前,可以添加一些错误处理来检查消息是否被正确分割。
例如,你可以这样做:
message = client.recv(1024).decode()
if not message:
break
lines = message.splitlines()
if not lines:
break
request = lines[0].split()
if len(request) < 2:
break
path = request[1]
try:
with open('.' + path, 'rb') as file:
response = file.read()
client.sendall(f"HTTP/1.1 200 OKnn{response}".encode())
except FileNotFoundError:
client.sendall("HTTP/1.1 404 Not Found".encode())
client.close()
此代码首先检查接收到的消息是否为空。然后,它将消息分成几行,并检查列表是否为空。然后,它将第一行拆分为几个部分,并检查列表是否至少有两个元素。最后,它尝试打开请求的文件并将其作为响应发送回客户机。如果没有找到该文件,它将发送404错误。注意,这段代码还使用with语句来确保在读取后正确关闭文件。