2016-07-18 2 views
0

Какой будет лучший способ получить большой список через TCP-сокеты?Получите большой список через TCP-сокеты - Python

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

print 'connection from', client_address 
    while True: 
     try: 
      data = pickle.loads(connection.recv(8192)) 
     except EOFError: 
      print 'no more data from', client_address 
      break 
+0

Почему это не работает? Вы разбиваете свои данные, запрашивая 8192 байта за раз, что является приличным и, вероятно, лучшим, что вы можете сделать в любом случае. Какие улучшения вы надеетесь получить? –

+0

Обратите внимание, что 'pickle' небезопасно - если вы явно не *** *** доверяете своему источнику,' json.load' может быть лучшим вариантом –

+0

@AkshatMahajan Это не работает для действительно большого списка, потому что i не извлекайте строку или элементы списка, кроме самого списка. – K09

ответ

0

Лучший способ сделать это, чтобы превратить socket в file объекта. Вы можете сделать это с помощью connection.makefile(). Затем вместо вызова pickle.loads() - который ожидает полную байтовую строку, содержащую весь маринованный объект - вызов pickle.load(connection.makefile()). Таким образом, вы позволяете модулю pickle обрабатывать весь «файл». Он будет называть функцию read объекта повторно, пока не получит все ожидаемые данные.

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

+0

Это потрясающе !! Спасибо :) – K09

Смежные вопросы