gpt4 book ai didi

python - 带有 python 套接字的 HTTP 服务器

转载 作者:行者123 更新时间:2023-12-03 12:02:14 25 4
gpt4 key购买 nike

我编写了一个使用 HTTP 协议(protocol)与 chrome 浏览器通信的服务器代码,由于某种原因,我得到了一个异常。
异常是索引越界异常,但服务器仍然对 chrome 做出响应,我可以在屏幕上显示的 html 文件上看到答案。 (异常(exception)是在 recv 函数中 get_clients_req() )。
如果有人能解释我为什么,我会很高兴。

import socket

IP = '127.0.0.1'
PORT = 80


def get_clients_req(client):
recv = client.recv(2 ** 16).decode()
recv = recv.split('\n')[0].split('/')
recv = recv[1].split(' ')[0].split('?')
return recv[0], recv[1].split('&')


def clean_data(request, params):
valid = False
clean_params = []
error_msg = 'Not Valid Request'
if request == 'calculate-area' and len(params) == 2:
if 'height' in params[0] and 'width' in params[1]:
print(params[0], params[1])
valid = True
error_msg = 'Everything is just Fine <3<3'
clean_params.append(params[0].replace('height=', ''))
clean_params.append(params[1].replace('width=', ''))
print(clean_params[0], clean_params[1])
else:
valid = False
error_msg = 'Parameters are not valid'
clean_params = []
else:
valid = False
error_msg = 'Request is not valid'
clean_params = []
return (valid, error_msg, clean_params)


def handle_request(client, clean_params):
area = int(clean_params[0]) * int(clean_params[1]) / 2
data = 'HTTP/1.1 200 OK \r\n'
data = 'HTTP/1.1 200 OK \r\n'
data += 'Connect-Type: text/html; charset=utf-8\r\n'
data += '\r\n'
data += f'<html><body>{area}</body></html>\r\n\r\n'
client.sendall(data.encode())
client.shutdown(socket.SHUT_WR)


server = socket.socket()
server.bind((IP, PORT))
server.listen()

print(f'URL: {IP}:{PORT}')

while 1:
client, client_add = server.accept()
request, params = get_clients_req(client)
(valid, error_msg, clean_params) = clean_data(request, params)
handle_request(client, clean_params)

异常(exception):
Traceback (most recent call last):
File "C:/Users/orlav/PycharmProjects/networks_book/chapter_4/e4.8.py", line 56, in <module>
request, params = get_clients_req(client)
File "C:/Users/orlav/PycharmProjects/networks_book/chapter_4/e4.8.py", line 11, in get_clients_req
return recv[0], recv[1].split('&')
IndexError: list index out of range

最佳答案

recv = recv[1].split(' ')[0].split('?')
return recv[0], recv[1].split('&')

没有 recv[1]如果没有 ?,则在最后一行在原始请求中,这会导致您看到堆栈跟踪。虽然您没有显示您打算发送的原始请求,但浏览器通常会尝试访问一些 /facicon.ico本身,此请求没有 ? .

关于python - 带有 python 套接字的 HTTP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64322040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com