Простой сервер Python TCP не отправляет всю веб-страницу

#python #html #tcp

#python #HTML #tcp

Вопрос:

Я начинающий студент compsci, и я пытаюсь закодировать простой сервер на python, который принимает HTML-страницу, хранящуюся в том же каталоге, и отправляет ее клиенту в той же сети, используя TCP-соединение.

Это мой код:

 from socket import *

serverPort = 8000
serverSocket = socket(AF_INET, SOCK_STREAM)
# Prepare a sever socket
serverSocket.bind(('', serverPort))  # binds socket to port 8000
serverSocket.listen(1)  # waiting for client to initiate connection

while True:
    # Establish the connection
    print('Ready to serve...')
    connectionSocket, addr = serverSocket.accept()
    try:

        message = connectionSocket.recv(1024)
        filename = message.split()[1]

        f = open(filename[1:].decode())
        outputdata = f.read()

        # Send one HTTP header line into socket
        http_response = 'HTTP/1.1 200 OKn'

        connectionSocket.send(http_response.encode())

        # Send the content of the requested file to the client
        for i in range(0, len(outputdata)):
            connectionSocket.send(outputdata[i].encode())

        connectionSocket.send("rn".encode())
        connectionSocket.close()
    except IOError:
        connectionSocket.send("rn".encode())
        # DO LATER
serverSocket.close()
sys.exit()
  

И это моя простая HTML-страница:

 <!DOCTYPE html>
<html>
  <body>
    <h1>My First Web Page</h1>

    <p>You have successfully accessed the Web Server</p>
  </body>
</html>
  

До сих пор, когда я запускаю свой сервер и направляю на него свой браузер, я получаю только следующее:

 <p>You have successfully accessed the Web Server</p>
  

Вместе с телом и html-тегами после этого. Проверка источника страницы, нет заголовка.

Я запустил Wireshark при попытке получить доступ к моему серверу, и действительно, кажется, что я отправляю только через «Вы успешно обратились к веб-серверу» и далее. Это несмотря на то, что функция печати показывает, что я определенно отправляю все данные в файле через TCP-соединение.

Кто-нибудь знает, в чем проблема?

Комментарии:

1. Вам разрешено использовать только библиотеку сокетов? В противном случае вы могли бы использовать библиотеки, такие как http.server

2. @tschomacker я думаю, что мы можем импортировать другие, но я чувствую, что они не ожидают, что мы сделаем что-то, с чем мы не были знакомы?

Ответ №1:

После отправки ответа протокола и заголовков фактический ответ приходит после двух rn последовательностей.

Используйте этот исправленный код:

 from socket import *

serverPort = 8000
serverSocket = socket(AF_INET, SOCK_STREAM)
# Prepare a sever socket
serverSocket.bind(('', serverPort))  # binds socket to port 8000
serverSocket.listen(1)  # waiting for client to initiate connection

while True:
    # Establish the connection
    print('Ready to serve...')
    connectionSocket, addr = serverSocket.accept()
    try:

        message = connectionSocket.recv(1024)
        filename = message.split()[1]

        f = open(filename[1:].decode())
        outputdata = f.read()

        # Send one HTTP header line into socket
        http_response = 'HTTP/1.1 200 OKn'

        connectionSocket.send(http_response.encode())
        connectionSocket.send("rn".encode())
        connectionSocket.send("rn".encode())

        # Send the content of the requested file to the client
        for i in range(0, len(outputdata)):
            connectionSocket.send(outputdata[i].encode())

        connectionSocket.close()
    except IOError:
        # DO LATER
serverSocket.close()
sys.exit()
  

Комментарии:

1. Спасибо!! Это сделало это. Могу ли я спросить, почему вам пришлось удалить r n после того, как данные тоже были отправлены?

2. @reetyn Насколько я знаю, в конце ответа нет разделителя. Вы могли бы оставить это, но это будет частью html веб-сайта.

3. @reetyn Если этот ответ помог вам, вы можете рассмотреть возможность принятия ответа, чтобы он помог и другим.

Ответ №2:

Я бы использовал http.server библиотеку

 import http.server
import socketserver

PORT = 8080
Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    httpd.serve_forever()
  

источник:https://www.afternerd.com/blog/python-http-server /

Комментарии:

1. Я не знаю, смогу ли я, потому что они определенно хотят, чтобы мы использовали эту строку кода: «для i в диапазоне (0, len(outputdata)): / connectionSocket.send(outputdata[i].encode())»