Новичку в Python нужен урок об ошибках атрибутов

(Python) Когда я пытаюсь запустить свою программу, я получаю сообщение об ошибке, показанное ниже.

Traceback (most recent call last):
File "/Volumes/USER/server.py", line 15, in <module>
filename = message.split()[1]
AttributeError: 'tuple' object has no attribute 'split'

Я попытался изменить значение для filename = message.split()[0], но это не сработало.

#import socket module
import socket 
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
#Prepare a sever socket 
serverName = socket.gethostname()
serverPort = 1234
serverSocket.bind(('', serverPort))
serverSocket.listen(1)
while True:     
#Establish the connection    
    print('Ready to serve...')     
    connectionSocket, addr = serverSocket.accept()
    try:         
        message =  connectionSocket.recvfrom(1024)
        filename = message.split()[1]
        f = open(filename[1:])
        outputdata = f.read()
        #Send one HTTP header line into socket         
        header = 'HTTP/1.1 200 OK\r\n' +\
            'Connection: close\r\n' + \
            'Content-Type: text/html\r\n' + \
            'Content-Length: %d\r\n\r\n' % (len(outputdata))
        connectionSocket.send(header.encode())
        #Send the content of the requested file to the client
        for i in range(0, len(outputdata)):
            connectionSocket.send(outputdata[i].encode())
        connectionSocket.close()
    except IOError:
        #Send response message for file not found
        header = 'HTTP/1.1 404 Not Found\r\n\r\n'
        connectionSocket.send(header.encode())
        #Close client socket
        connectionSocket.close()
serverSocket.close()

В той же директории, что и программа server.py, у меня есть файл helloworld.html, который должен загружаться при переходе на IP-адрес сервера с жестко заданным портом, а также отображать 404 при переходе к файлу этого не существует бывший (192.168.1.2:1234/helloworld.html)

1 ответ

Согласно документации:

socket.accept()

Принять соединение. Сокет должен быть привязан к адресу и прослушивать соединения. Возвращаемое значение представляет собой пару (conn, address) где conn - это новый объект сокета, используемый для отправки и получения данных о соединении, а адрес - это адрес, связанный с сокетом на другом конце соединения.

Итак, в вашем коде, после того, как вы делаете

message =  connectionSocket.recvfrom(1024)
filename = message.split()

message становится кортежем (conn, address),

Теперь у кортежей нет метода split(), Только строки имеют этот метод. Я думаю, что вы пытаетесь сделать это разделить адрес - поэтому вы должны сначала получить второй элемент кортежа (который, конечно, строка), а затем разделить это:

filename = message[1].split()
Другие вопросы по тегам