Python套接字编程的Web服务器不会向浏览器发送信息

问题描述 投票:0回答:1

我使用python套接字编程创建了一个简单的Web服务器。当我使用套接字编程的客户端访问它时,会收到此响应(似乎不错):

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

Web服务器代码:

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()
python sockets webserver
1个回答
0
投票
if(request_splitted[1].find('http://') != 0):
    return False

您希望浏览器发送这样的请求

 GET http://domain/page HTTP/1.1
 ...

但是,正常的HTTP请求不包括协议和主机,而仅包括页面,即,它看起来像这样

 GET /page HTTP/1.1
 ...

由于将来自浏览器的有效请求视为无效,因此关闭了连接,因此没有响应发送到浏览器。

请注意,HTTP并非看起来那么简单。有一个实际的标准很长,在实现HTTP服务器或客户端时,您应该遵循该标准。

© www.soinside.com 2019 - 2024. All rights reserved.