Файлы не отображаются в браузере с использованием многопоточного сокета Python-сервера - PullRequest
0 голосов
/ 22 марта 2019

Проблема, с которой я сталкиваюсь, заключается в следующем:

Я построил многопоточный TCP-сервер с использованием модуля сокетов в Python (или, по крайней мере, я пытался). Сервер отлично работал в своей однопоточной реализации и, кажется, отлично передает файл через CLI, когда я использую его с написанным мной клиентским скриптом, но когда я использую его с браузером, файлы просто не отображаются - сообщение о статусе HTTP будет проходить (HTTP / 1.0 200 OK или HTTP / 1.0 404 файл не найден), но сам файл не будет ... или, если это произойдет, он не будет отображаться в браузере.

Если бы кто-то мог взглянуть на мой код и помочь мне понять, что происходит, я был бы очень признателен. Вот основная часть моего кода (я пропустил операторы импорта, и если имя dunder равно основной части кода ...):

#Thread function:

def threaded(connectionSocket):

    while True:

        try:
            #Request received from client
            message = connectionSocket.recv(1024)

            #Create received time stamp
            recv_time = time.time()

           #If the request is coming from the CLI, do this:
            filename = message

            #If the request is coming from a browser, do this:
            if len(message.decode('utf-8')) > 20:
                #Parse message from client
                filename = message.split()[1]

            filename = filename.decode('utf-8')
            f = open('.' + filename, 'r')
            outputdata = f.read(1024)

            #Send HTTP 200 OK Response message
            connectionSocket.sendall(bytes("HTTP/1.0 200 OK\n", "utf-8"))

            #Send data to client
            connectionSocket.sendall(outputdata.encode('utf-8'))

            #Display response to console
            print("HTTP/1.0 200 OK")

            #Create sent time stamp
            sent_time = time.time()
            break

        except:

            #Send response message for file not found
            connectionSocket.send(bytes('HTTP/1.0 404 File Not Found \n', 'utf-8'))

            #Display to console
            print("HTTP/1.0 404 File Not Found")

            #Create time stamp
            sent_time = time.time()
            break

    #Calculate RTT
    rtt = round((sent_time - recv_time), 3)

    #Display RTT
    print("RTT: " + str(rtt) + "ms")

    #Close connection and release lock
    connectionSocket.close()
    data_lock.release()
    print("Lock Released\n")

#The serve function which generates the server socket and initiates the thread

def serve():
    #Create a server socket
    serverSocket = socket(AF_INET, SOCK_STREAM)

    #Prepare a server socket
    HOST = '127.0.0.1'
    PORT = 50007
    serverSocket.bind((HOST, PORT))
    serverSocket.listen(5)

    while True:

        #Acquire lock
        data_lock.acquire()
        print("Lock acquired")
        print('Ready to serve...')

        #Establish the connection
        connectionSocket, addr = serverSocket.accept()
        print('Connected by ' + str(addr))

        #Start new thread
        start_new_thread(threaded, (connectionSocket,))
        break

    #Close this socket
    serverSocket.close()

#The main function:
def Main():
    while True:
        serve()

Мне кажется, что я, вероятно, упускаю что-то довольно очевидное, но я довольно плохо знаком с программированием сокетов, многопоточностью и всем подобным. Любой совет будет очень полезным.

Спасибо!

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