使用Pickle在Python中进行对象传输

时间:2018-02-25 13:37:23

标签: python sockets pickle

我有以下类,一个Point对象

class Point:
    def __init__(self):
        pass

    def __init__(self, x, y):
        self.x = x
        self.y = y

我有一台服务器(使用UDP)

# Server side
import socket
import pickle

host = "localhost"
port = 10000

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host, port))

data = s.recvfrom(1024)
print(data)

我的客户方是:

import socket
import pickle
from Point import *

host = "localhost"
port = 10000
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

p = Point(10, 20)
a = pickle.dumps(p)

s.sendto(a, (host, port))

在服务器端,每当我收到p并打印出来时,我都会收到以下(b'\x80\x03cPoint\nPoint\nq\x00)\x81q\x01}q\x02(X\x01\x00\x00\x00xq\x03K\nX\x01\x00\x00\x00yq\x04K\x14ub.', ('127.0.0.1', 55511))

如何获取对象,而不是这个?

2 个答案:

答案 0 :(得分:-2)

Pickle不适合此目的。考虑this warning

  

警告pickle模块不能防止错误或   恶意构造的数据。切勿取消从中收到的数据   不受信任或未经认证的来源。

您的协议缺少任何类型的访问控制,因此您的进程容易受到任意远程代码执行攻击。

请考虑使用真实的网络协议。有很多可供选择。例如,Cap' Proto

答案 1 :(得分:-2)

解决方案是在服务器端使用pickle.loads,如下所示

d = s.recvfrom(1024)
p1 = Point(1,1)
p1 = pickle.loads(d[0])
print(str(p1.x))

但是,正如许多人所建议的那样,pickle可能不是这种情况的最佳解决方案。