Здесь происходит несколько проблем.
Приведенный код просто работает. Вы пытаетесь открыть файл, который находится в рабочем каталоге процесса python, выполняя сценарий. Например, если вы используете что-то вроде
python script.py
, файл HTML должен находиться в том же каталоге, что и скрипт.
$ ls .
script.py
index.html
Однако, если вы запускаете скрипт из другого каталога или настройки рабочего каталога при запуске скрипта файл HTML должен находиться в этом месте.
Вы даже можете изменить рабочий каталог внутри скрипта с помощью os.chdir () метод. например для вашего кода:
import socket
import sys
import os
HOST = socket.gethostbyname('localhost')
PORT = 8080
HTML_ROOT = '/var/www/html'
if __name__ == '__main__':
os.chdir(HTML_ROOT)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("Socket Created!!")
try:
s.bind((HOST, PORT))
except socket.error as msg:
print("Bind failed. Error Code: " + str(msg[0]) + "Message: " + msg[1])
sys.exit()
print("Socket bind complete")
s.listen(10)
print('Socket now listening')
while True:
connectionSocket, addr = s.accept()
print('source address:' + str(addr))
try:
message = connectionSocket.recv(1024)
print('message = ' + str(message))
filename = message.split()[1]
print('filename = ' + str(filename))
f = open(filename[1:], 'rb')
outputdata = f.read()
headerLine = "HTTP/1.1 200 OK \r\n content-type:text/html \r\n charset=utf-8\r\n\r\n"
connectionSocket.send(headerLine.encode())
print(outputdata)
connectionSocket.send(outputdata)
connectionSocket.close()
print("Connection closed!")
except IOError:
headerLine = "HTTP/1.1 404 Not Found \r\n content-type:text/html \r\n charset=utf-8 \r\n\r\n"
connectionSocket.send(headerLine.encode())
connectionSocket.send("<h3>404 Not Found</h3>".encode())
connectionSocket.close()
serverSocket.close()