我有以下类,一个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))
如何获取对象,而不是这个?
答案 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
可能不是这种情况的最佳解决方案。