es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Estoy utilizando el socket de Python para construir HTTPServer, pero mi respuesta de CSS se queda pendiente.

Estoy haciendo un httpServer. Cuando el cliente ingrese localhost: 8888 / good.html , será dirigido a la página correspondiente.

Lo que me confunde es que mi respuesta CSS (res_for_style) sigue pendiente. Por favor, avíseme dónde me equivoqué.

Server.py

import socket
import json
import sys
import threading

pars = ('127.0.0.1', 8888)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(pars)
s.listen(5)

res_for_good = '''HTTP/1.1 200 OK
Content-Type: text/html

<head>
<link rel="stylesheet" href="./style.css" type="text/css">
</head>
<html>
<body>good HaHa</body>
</html>
'''

res_for_style = '''HTTP/1.1 200 OK
Content-Type: text/css

body{
    color: red;
}
'''

def serveClient(clientsocket, address):
    while True:
        data = clientsocket.recv(1024)
        data_utf8 = data.decode('utf-8').split('\r\n')

        if '/good.html' in data_utf8[0]:
            clientsocket.sendall(res_for_good.encode())

        if '/style.css' in data_utf8[0]:
            print("transfer css")
            res = "Content-Type: text/css\n\n" + css_file.read()
            clientsocket.sendall(res_for_style.encode())

        if data == b'':
            clientsocket.close()
            break

while True:
    (clientsocket, address) = s.accept()
    threading.Thread(target=serveClient, args=(clientsocket, address)).start()
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar en la variable res_for_style. En lugar de asignarle la respuesta que incluye el archivo CSS, se le está asignando una cadena vacía (''). Luego, en el bloque if '/style.css' in data_utf8[0]:, se lee el archivo CSS y se construye la respuesta sobre la marcha. Sin embargo, nunca se envía esta respuesta de vuelta al cliente.

    Para solucionar esto, debería asignar la respuesta de CSS a res_for_style cuando el servidor se inicia, y luego enviarla de vuelta al cliente cuando se solicita el archivo CSS. Aquí hay una versión actualizada de la función serveClient que debería funcionar:

    def serveClient(clientsocket, address):
        while True:
            data = clientsocket.recv(1024)
            data_utf8=data.decode('utf-8').split('\r\n')
    
            if '/good.html' in data_utf8[0]:
                clientsocket.sendall(res_for_good.encode())
    
            if '/style.css' in data_utf8[0]:
                clientsocket.sendall(res_for_style.encode())
    
            if data == b'':
                clientsocket.close()
                break
    

    Y aquí está la parte superior actualizada de Server.py para incluir la respuesta de CSS:

    import socket
    import json
    import sys
    import threading
    
    pars = ('127.0.0.1', 8888)
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind(pars)
    s.listen(5)
    
    res_for_good = '''HTTP/1.1 200 OK
    Content-Type: text/html
    
    <head>
    <link rel="stylesheet" href="./style.css" type="text/css">
    </head>
    <html>
    <body>good HaHa</body>
    </html>
    '''
    
    with open('style.css', 'r') as css_file:
        res_for_style='''HTTP/1.1 200 OK
    Content-Type: text/css
    
    {}'''.format(css_file.read())
    
    def serveClient(clientsocket, address):
        while True:
            data = clientsocket.recv(1024)
            data_utf8=data.decode('utf-8').split('\r\n')
    
            if '/good.html' in data_utf8[0]:
                clientsocket.sendall(res_for_good.encode())
    
            if '/style.css' in data_utf8[0]:
                clientsocket.sendall(res_for_style.encode())
    
            if data == b'':
                clientsocket.close()
                break
    
    while True:
        (clientsocket, address) = s.accept()
        threading.Thread(target = serveClient, args = (clientsocket, address)).start()
    

    Ahora, cuando se solicita localhost:8888/good.html, el servidor devolverá la respuesta HTML y el archivo CSS.

Comments are closed.