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

У меня проблемы с тем, чтобы мой очень простой и простой 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 OK\r\n") 
        for i in range(0, len(outputdata)):           
            connectionSocket.send(outputdata[i].encode())
            connectionSocket.send("\r\n".encode())
        connectionSocket.close()
    except IOError:
        connectionSocket.send("file not found")
        serverSocket.close()
sys.exit()

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

message = connectionSocket.recv(1024)

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

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

http://127.0.0.1:4567/helloworld.html

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


person Esteban D    schedule 18.10.2016    source источник
comment
я получаю ошибки, а какие ошибки? Затем мой код сразу вылетает после получения HTTP-запроса. вы понимаете, почему он вылетает?   -  person xaxxon    schedule 18.10.2016


Ответы (1)


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

        connectionSocket.send(outputdata[i].encode())
        connectionSocket.send("\r\n".encode())

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

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

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

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

person xaxxon    schedule 18.10.2016