Запрограммированный сокет Python веб-сервер не отправляет информацию в браузер - PullRequest
0 голосов
/ 01 декабря 2019

Я создаю простой веб-сервер, использующий программирование сокетов Python. Когда я обращаюсь к нему с помощью клиента, запрограммированного на сокете, я получаю следующий ответ (который кажется хорошим):

HTTP/1.0 200 OK        
Content-Length: 145    
Content-Type: text/html

"""<!DOCTYPE html>
<html>
<body>

<h2>HTML Links</h2>
<p><a href="https://www.w3schools.com/html/">Visit our HTML tutorial</a></p>

</body>
</html>"""

Однако, когда я пытаюсь получить доступ к 127.0.0.1:80 в браузере, он говорит:

127.0.0.1 не отправил никаких данных. ERR_EMPTY_RESPONSE

Код веб-сервера:

import socket
import os

def get_content_type(filename):
    index = filename.rfind('.')
    extension = filename[index+1:len(filename)]
    if(extension == 'txt' or extension == 'html'):
        return 'Content-Type: text/html\n'
    elif(extension == 'jpg'):
        return 'Content Type: image/jpeg\n'
    elif(extension == 'js'):
        return 'Content Type: text/javascript; charset=UTF 8\n'
    elif(extension == 'css'):
        return 'Content Type: text/css\n'
    pass


def check_client_request(client_request):
    request_splitted = client_request.split()
    if(len(request_splitted) != 3):
        return False
    if(request_splitted[0] != 'GET'):
        return False
    if(request_splitted[1].find('http://') != 0):
        return False
    if(request_splitted[1].count('/') < 3):
        return False
    if(request_splitted[2] != 'HTTP/1.1\\r\\n'):
        return False
    return True


def recieve_client_request(client_socket):
    client_request = client_socket.recv(1024)
    return client_request.decode('utf-8')


def handle_client_request(request):
    try:
        filename = request.split()[1].split('/')[3]
    except:
        return 'File not found'
    if(filename == ''):
        filename = 'index.html'
    path = f'C:\\Users\\Eitan\\Desktop\\Python-Course\\SOCKETWEBSERVER\\{filename}'
    print(path)
    response = ''
    if(os.path.isfile(path)):
        try:
            requested_file = open(path, 'r')
            file_content = requested_file.read()
            requested_file.close()
            response = 'HTTP/1.0 200 OK\n'
            content_length = len(file_content.encode('utf-8'))
            response += f'Content-Length: {content_length}\n'
            response += get_content_type(filename)
            response += '\n'
            response += f'"""{file_content}"""'

        except:
            response = 'HTTP/1.1 404 Not Found\n'
    else:
        response = 'HTTP/1.1 404 Not Found\n'

    return response


def send_response(client_socket, response):
    try:
        client_socket.send(response.encode('utf-8'))
        print('Response Sent')
    except:
        print('Couldnt send response.')


def main():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('0.0.0.0', 80))
    server_socket.listen(1)
    while True:
        client_socket = server_socket.accept()[0]
        client_request = recieve_client_request(client_socket)
        if(check_client_request(client_request)):
            response = handle_client_request(client_request)
            send_response(client_socket, response)
            client_socket.close()
        else:
            client_socket.close()      

if(__name__ == '__main__'):
    main()

Код клиента:

import socket

def main():
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(('127.0.0.1', 80))
    request = input("Command: ").encode('utf-8')
    client_socket.send(request)
    response = client_socket.recv(1024)
    print(response.decode('utf-8'))

if(__name__ == '__main__'):
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...