.программирование сокета функции recv на TCP-сервере на Python

#python #sockets #http #tcp #decode

#python #сокеты #http #tcp #расшифровать

Вопрос:

У меня возникли проблемы с тем, чтобы мой очень простой и простой TCP-сервер правильно работал с http-запросами. Это то, что у меня есть до сих пор

 from socket import *
import sys 
serverSocket = socket(AF_INET, SOCK_STREAM)


serverSocket.bind(('', 4567))
serverSocket.listen(1)

while True:
    print('Ready to serve...')
    connectionSocket, addr =  serverSocket.accept()
    print("connected from: ", addr)
    try:
        message = connectionSocket.recv(1024)
        filename = message.split()[1]                 
        f = open(filename[1:])         
        outputdata = f.read()
        connectionSocket.send("HTTP/1.1 200 OKrn") 
        for i in range(0, len(outputdata)):           
            connectionSocket.send(outputdata[i].encode())
            connectionSocket.send("rn".encode())
        connectionSocket.close()
    except IOError:
        connectionSocket.send("file not found")
        serverSocket.close()
sys.exit()
  

Ошибка возникает из инструкции open . Я не совсем понимаю, как организовано возвращаемое значение этой строки кода.

 message = connectionSocket.recv(1024)
  

Я знаю, что возвращаемое значение выражается в байтах, но когда я пытаюсь использовать функцию, чтобы превратить его в строку, например decode(), я также получаю ошибки

У меня есть файл .py и HTML-файл, находящиеся в одном каталоге на моем локальном компьютере, и способ, которым я это проверяю, заключается в том, что я просто запускаю это, открываю браузер и набираю

 http://127.0.0.1:4567/helloworld.html
  

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

Комментарии:

1. «я также получаю ошибки» какие ошибки? «Затем мой код быстро выходит из строя после получения HTTP-запроса». вы получаете какие-либо указания на то, почему он выходит из строя?

Ответ №1:

С вашим кодом существует множество проблем, и, поскольку вы не указываете, какие конкретные проблемы вас беспокоят, вот что я вижу:

         connectionSocket.send(outputdata[i].encode())
        connectionSocket.send("rn".encode())
  

Похоже, что после каждого символа, который вы отправляете обратно клиенту, отправляется новая строка.

Кроме того, он не обрабатывает отключение клиента, потому что вы отправляете обратно неверные данные.

Даже если в том, что вы пытались сделать, не было этих ошибок, вы, похоже, не пытаетесь отправить обратно действительный http-ответ.

https://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html