为什么这个腌制数据在通过网络传输后没有取消腌制?

发布于 2024-09-15 07:07:36 字数 727 浏览 5 评论 0原文

logexample.py 使用logging.handlers.DatagramHandler 通过网络进行记录,它会pickles(协议1)它发送的数据。

logserver.py 应该解封并打印到屏幕,但它却引发错误。如果我使用 pickle.loads 那么 KeyError: '\x00' 如果我使用 cPickle.loads 它是一个 EOFError

文件在这里 - http://gist.github.com/542543

Python 版本 2.6.5

为什么会发生这种情况?

--------------------------修复---------------------- -----

对于其他可能感兴趣的人,这里是固定处理程序

class LogHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        data = self.request[0]
        socket = self.request[1]
        out = pickle.loads(data[4:])
        record = logging.makeLogRecord(out)
        print record.msg

logexample.py logs over the network using logging.handlers.DatagramHandler, which pickles(protocol 1) the data it sends.

logserver.py is supposed to unpickle and print to screen, but instead it raises an error. If I use pickle.loads then KeyError: '\x00' and if I use cPickle.loads its an EOFError

The files are here - http://gist.github.com/542543

Python version 2.6.5

Why is this happening?

--------------------------THE FIX---------------------------

For anyone else who might be interested, here is the fixed handler

class LogHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        data = self.request[0]
        socket = self.request[1]
        out = pickle.loads(data[4:])
        record = logging.makeLogRecord(out)
        print record.msg

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

年华零落成诗 2024-09-22 07:07:36

There is an example in the docs of how to use DataGramHandler - it shows that the datagram may be sent over multiple packets, which need to be reassembled at the receiving end. The first four bytes of the first packet are the length - you are passing this into pickle.loads as well as the pickled data. Use the example code instead.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文