import socket
import os.path
IP = "127.0.0.1"
PORT = 80
DEFAULT_URL = "C:\webroot\index.html"
SOCKET_TIMEOUT = 0.2
def get_file_data(filename):
""" Get data from file """
source_file = open(filename, 'rb')
data = source_file.read()
source_file.close()
return data
def handle_client_request(resource, client_socket):
""" Check the required resource, generate proper HTTP response and send to client"""
if resource == '/':
url = DEFAULT_URL
else:
url = resource
if os.path.isfile(url):
http_header = "HTTP/1.0 200 OK\r\n"
else:
client_socket.send("404 (Not Found)\r\n" + "connection close")
client_socket.close()
file_type = url.split(".")[-1]
if file_type == 'html' or file_type == 'txt':
http_header += "Content-Type: text/html; charset=utf-8\r\n"
elif file_type == 'jpg':
http_header += "Content-Type: image/jpeg\r\n"
elif file_type == 'js':
http_header += "Content-Type: text/javascript; charset=UTF-8\r\n"
elif file_type == 'css':
http_header += "Content-Type: text/css\r\n"
data = get_file_data(url)
http_header += "Content-Length:" + str(len(data)) + "\r\n"
http_response = http_header + "\r\n" + data
client_socket.send(http_response)
def validate_http_request(request):
""" Check if request is a valid HTTP request and returns TRUE/FALSE and the requested URL """
request_li = request.split("\r\n")[0].split(" ")
if request_li[0] != "GET" or request_li[2] != "HTTP/1.1" '/':
return False, ''
return True, request_li[1]
def handle_client(client_socket):
""" Handles client requests: verifies client's requests are legal HTTP, calls function to handle the requests """
print 'Client connected'
try:
while True:
client_request = client_socket.recv(1024)
print client_request.split("\r\n")[0]
valid_http, resource = validate_http_request(client_request)
if valid_http:
print 'Got a valid HTTP request'
handle_client_request(resource, client_socket)
else:
print "Error: HTTP request isn't valid"
break
print "closing connection"
client_socket.close()
except socket.timeout:
print "closing connections"
client_socket.close()
def main():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((IP, PORT))
server_socket.listen(10)
print "Listening for connections on port %d" % PORT
while True:
client_socket, client_address = server_socket.accept()
client_socket.settimeout(SOCKET_TIMEOUT)
print 'New connection received'
handle_client(client_socket)
if __name__ == "__main__":
main()
Я создаю HTTP-сервер для назначения, сервер должен запускать локальные файлы с моего компьютера в браузере. Прямо сейчас я пытаюсь запустить url по умолчанию.Обработка запросов клиентов на http-сервере
Сначала я получаю «/» как хороший запрос, но затем получаю пустой запрос, который является недопустимым запросом, который закрывает соединение. После того, как сервер создает новое соединение, он получает «/css/doremon.css» в качестве запроса. doreomn.css - это файл веб-сайта, который я пытаюсь запустить. Это создаст ошибку в get_file_data, потому что путь должен быть: «C: \ webroot \ css \ doremon.css».
Это вызывает два вопроса: 1. Почему клиент отправляет пустые запросы на сервер? Как я могу предотвратить прерывание соединения? 2. С третьего запроса кажется, что клиент сначала отправляет запрошенный URL-адрес, а затем запрашивает файлы, связанные с ним, есть ли способ получить их все сразу? Если нет, то как я могу исправить путь для запрошенных файлов?
Кажется, что ваши вопросы касаются действий клиента, но вы только демонстрируете код сервера - если клиент отправляет запросы, которые вы не знаете, как обращаться с ними, почему вы не корректируете свой код сервера для их обработки? – Jmills
Если ваш клиент является веб-браузером (а не 'curl'), вы можете получить http-команду' OPTIONS'. как вы справляетесь с этим? – Ereli
также стоит прочитать о [keep-alive] (https://en.wikipedia.org/wiki/HTTP_persistent_connection) и о том, как HTTP-соединения повторно используются. здесь также http://stackoverflow.com/a/20799796/1265980 – Ereli