Программирование сокета сервера не может найти файл - PullRequest
0 голосов
/ 19 февраля 2020

В этой программе я пытаюсь разработать веб-сервер, который обрабатывает один HTTP-запрос за раз. Веб-сервер должен принять и проанализировать HTTP-запрос, получить запрошенный файл из файловой системы сервера, создать ответное сообщение HTTP, состоящее из запрошенного файла, которому предшествуют строки заголовка, а затем отправить ответ непосредственно клиенту. Если запрошенный файл отсутствует на сервере, сервер должен вернуть сообщение HTTP 404 «Not Found».

Вот код, который я пытался заставить его работать:

#import socket module
from socket import *
serverPort = 6789
import sys #In order to terminate the program

serverSocket = socket(AF_INET, SOCK_STREAM)

#Prepare a server socket on a particular port
# Fill in code to set up the port
serverSocket.bind(('',serverPort))
serverSocket.listen(1)

while True:
    # Establish the connection
    print('Ready to serve...')
    connectionSocket, addr = serverSocket.accept() # Fill in code to get a connection
    try:
        message = connectionSocket.recv(1024)#Fill in code to read GET request
        filename = message.split()[1]
        # Fill in security code
        f = open(filename)
        outputdata = f.read()# Fill in code to read data from the file
        # Send http HEADER LINE (s) into socket
        #Fill in code to send header(s)
        # Send the content of the requested file to the client
        print(outputdata)
        connectionSocket.send('\nHTTP/1.1 200 OK\n\n')
        connectionSocket.send(outputdata)
        for i in range(0, len(outputdata)):
          connectionSocket.send(outputdata[i].encode())
        connectionSocket.send("\r\n".encode())
        connectionSocket.close()
    except IOError:
        #Send response message for file not found
        #Fill in
        print ("404 Page Not Found")
        connectionSocket.send('\nHTTP/1.1 404 Not Found\n\n')
        #Close client socket
        # Fill in
        connectionSocket.close
serverSocket.close()
sys.exit()

Затем я пытаюсь получить доступ к файлу с именем HelloWorld. html, набрав localhost: 6789 / HelloWorld. html в адресной строке браузера, чтобы заставить программу работать, но я получаю эту ошибку:

Ready to serve...
404 Page Not Found
Traceback (most recent call last):
  File "C:/Users/jcdos/Desktop/CS436/hw2.py", line 21, in <module>
    f = open(filename)
FileNotFoundError: [Errno 2] No such file or directory: b'/HelloWorld.html'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/Users/jcdos/Desktop/CS436/hw2.py", line 37, in <module>
    connectionSocket.send('\nHTTP/1.1 404 Not Found\n\n')
TypeError: a bytes-like object is required, not 'str'

Я получаю ошибку 404 not found, но файл HTML находится в том же каталоге, что и мой файл python. HelloWorld. html находится в той же папке рабочего стола, что и файл python. Кроме того, при вводе localhost в веб-браузер, браузер всплывает с этим: enter image description here

1 Ответ

0 голосов
/ 19 февраля 2020

Если файл существует в каталоге, это может быть связано с неправильным именем файла. Я вижу, что в имени файла он проверяет '/HelloWorld.html', тогда как он должен быть 'HelloWorld.html'.

. Так что просто обновите свой код, чтобы исключить опережающее имя впереди sh.

filename = message.split()[1]

К

file= message.split()[1]
filename = file[1:]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...