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()
2 odpowiedzi
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()
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
Podobne pytania
Nowe pytania
python
Python to wielozadaniowy, wielozadaniowy język programowania dynamicznie typowany. Został zaprojektowany tak, aby był szybki do nauczenia się, zrozumienia i użycia oraz wymuszania czystej i jednolitej składni. Należy pamiętać, że Python 2 oficjalnie nie jest obsługiwany od 01-01-2020. Mimo to, w przypadku pytań Pythona specyficznych dla wersji, dodaj znacznik [python-2.7] lub [python-3.x]. Korzystając z wariantu Pythona (np. Jython, PyPy) lub biblioteki (np. Pandas i NumPy), należy umieścić go w tagach.