Python Гнездо - Не могу слушать - PullRequest
0 голосов
/ 12 марта 2020

я написал python скрипт сокета. В любом случае я могу слушать, открыв свою собственную. HTML страницу на localhost? Мне бы хотелось слушать, когда я открываю свою собственную страницу HTML, я просто не знаю, в какую папку ее поместить.

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 ]

0 голосов
/ 12 марта 2020

Здесь происходит несколько проблем.

Приведенный код просто работает. Вы пытаетесь открыть файл, который находится в рабочем каталоге процесса 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()
0 голосов
/ 12 марта 2020

Вы можете просто сделать это - не нужно держать его в течение некоторого времени. L oop


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

Изменить для контекста: вы не закрываете сокет или не выходите из while, так что как только вы получают ваши данные, ожидают дополнительных подключений / сообщений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...