#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())»