@AlikhanPython
Учу программирование на Python.

Как исправить ошибку при передаче массива через socket и pickle в Python?

Хотел я через сокеты в Python передавать массив каждый раз при получении данных от сервера, то есть, клиент подключается к серверу и получает некий массив, массив в сервере, был завернут в pickle.dumps, а в клиенте мы получаем массив при помощи pickle.loads, но при этом вызывается ошибка.

Код сервера:
import socket
import pickle

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("127.0.0.1", 5467))

class Parser:
    pass

citys = ["Moscow", "New-York", "Paris", "London", "Chikago"]

if __name__ == "__main__":
    server.listen()

    parser = Parser()
    data = pickle.dumps([citys, parser])

    while True:
        user, address = server.accept()
        user.send(data)


Код клиента:
import socket
import pickle

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("127.0.0.1", 5467))

new_data = client.recv(65507)
data = pickle.loads(new_data)

print(data)


Но выдает вот такую ошибку:
Traceback (most recent call last):
  File "C:\Users\123\Desktop\client.py", line 8, in <module>
    data = pickle.loads(new_data)
AttributeError: Can't get attribute 'Parser' on <module '__main__' from 'C:\\Users\\123\\Desktop\\client.py'>
  • Вопрос задан
  • 197 просмотров
Решения вопроса 1
@kamenyuga
Pickle сохраняет объекты и ссылки на типы данных (названия классов и функций), но не их определения. Исправить ошибку можно разными путями.
1. Руками сохранить также определение класса.
2. Сделать в классе методы сохранения/загрузки объектов в стандартные типы данных или текст.
3. Использовать библиотеки, которые сразу сериализуют больше данных, например, dill.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы