Новичку в Python нужен урок об ошибках атрибутов - PullRequest
0 голосов
/ 27 марта 2019

(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'

Я попытался изменить значение имени файла = 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()

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

1 Ответ

0 голосов
/ 27 марта 2019

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

socket.accept()

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

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

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

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

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

filename = message[1].split()
...