python 我的微型http服务器有一个列表索引错误

bvjxkvbb  于 2023-04-04  发布在  Python
关注(0)|答案(1)|浏览(92)

我在一个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 \n\n{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 \n\n{open(f'.{client.recv(1024).decode().splitlines()[0].split()[1]}', 'rb').read()}").encode('utf-8'))

                                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^

IndexError: list index out of range
91zkwejq

91zkwejq1#

错误消息指示列表索引超出范围,这意味着您正在尝试访问不存在的列表的元素。当您尝试拆分从客户端接收的消息时,会发生这种情况:

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 OK\n\n{response}".encode())
except FileNotFoundError:
    client.sendall("HTTP/1.1 404 Not Found".encode())

client.close()

这段代码首先检查接收到的消息是否不为空。然后它将消息拆分成行并检查列表是否不为空。然后它将第一行拆分成部分并检查列表是否至少有两个元素。最后,它尝试打开请求的文件并将其作为响应发送回客户端。如果没有找到该文件它会发送一个404错误。请注意,这段代码还使用with语句来确保文件在阅读后正确关闭。

相关问题