Проблема, с которой я сталкиваюсь, заключается в следующем:
Я построил многопоточный 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()
Мне кажется, что я, вероятно, упускаю что-то довольно очевидное, но я довольно плохо знаком с программированием сокетов, многопоточностью и всем подобным. Любой совет будет очень полезным.
Спасибо!