【问题标题】:Receive big list through TCP Sockets - Python通过 TCP 套接字接收大列表 - Python
【发布时间】:2016-07-18 20:39:26
【问题描述】:

通过 TCP 套接字接收大列表的最佳方式是什么?

我的代码如下所示。 当你必须收到一个大名单时,这显然不起作用。

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

【问题讨论】:

  • 为什么不起作用?您通过一次请求 8192 个字节来对数据进行分块,这很不错,而且可能是您能做的最好的。您希望获得哪些改进?
  • 请注意,pickle 不安全 - 如果您不明确信任您的来源,json.load 可能是更好的选择跨度>
  • @AkshatMahajan 它不适用于非常大的列表,因为我不获取列表中的字符串或项目,而是获取列表本身。
  • @WayneWerner 我会试试这个,但这不是我主要关心的问题。不过还是谢谢。

标签: python list sockets tcp


【解决方案1】:

最好的方法是将socket 转换为file 对象。您可以使用connection.makefile() 执行此操作。然后,不要调用pickle.loads()——它需要一个包含整个腌制对象的完整字节字符串——而是调用pickle.load(connection.makefile())。这样,您让pickle 模块处理读取整个“文件”。它会反复调用对象的read函数,直到收到所有预期的数据。

这基本上假设流的整个剩余部分都将被解封(这似乎是你想要做的,所以听起来它应该可以工作)。否则,您可能需要将自己的伪文件对象包装在对腌制对象的结尾有一些独立知识的流周围。

【讨论】:

  • 太棒了!!谢谢你:)
猜你喜欢
  • 2016-11-19
  • 2021-07-17
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
相关资源
最近更新 更多