Napisałem skrypt gniazda w języku Python. Czy w ogóle mogę słuchać, otwierając własną stronę .HTML na hoście lokalnym? Zasadniczo chciałbym słuchać, kiedy otwieram własną stronę HTML, po prostu nie wiem, w jakim folderze ją umieścić.

import socket
import sys

HOST = socket.gethostbyname('localhost')
PORT = 8080

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() 
0
iampython2134 12 marzec 2020, 23:13

2 odpowiedzi

Najlepsza odpowiedź

Dzieje się tu kilka kwestii.

Podany kod po prostu działa. Próbujesz otworzyć plik, który znajduje się w katalogu roboczym procesu Pythona, wykonując skrypt. Na przykład, jeśli prowadzisz coś takiego jak

python script.py

Plik HTML powinien znajdować się w tym samym katalogu, co skrypt.

$ ls .
script.py
index.html

Jeśli jednak uruchamiasz skrypt z innego katalogu lub ustawiasz katalog roboczy podczas uruchamiania skryptu, plik HTML powinien znajdować się w tej lokalizacji.

Możesz nawet zmienić katalog roboczy z poziomu skryptu za pomocą os.chdir (). na przykład dla twojego kodu:

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()
0
Robert Navado 12 marzec 2020, 20:39

Możesz po prostu to zrobić - nie ma potrzeby trzymania go w pętli while


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

s.close()

Edycja kontekstowa: nie zamykasz gniazda ani nie wychodzisz z While, więc po otrzymaniu danych oczekuje dodatkowych połączeń / wiadomości

0
Peter 12 marzec 2020, 20:30