【发布时间】:2020-12-30 13:48:27
【问题描述】:
客户端
我有以下代码从客户端发送数组到服务器。我正在检索 UTF-8 解码错误。我不喜欢加载数据 pickle 或 zlib compress。我是pyzmq socket来发送数据和接收数据。
def send_array(socket, A, flags=0, copy=True, track=False):
"""send a numpy array with metadata"""
md = dict(
dtype = str(A.dtype),
shape = A.shape,
)
socket.send_json(md, flags|zmq.SNDMORE)
return socket.send(A, flags, copy=copy, track=track)
def forward_data(frame, count):
source = cv2.imdecode(np.fromstring(base64.b64decode(frame), dtype=np.uint8), 1)
image = img_to_array(source)
image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))
preds = m1.predict(preprocess_input(image))
send_array(dest_socket,preds)
服务器端
def recv_array(socket, flags=0, copy=True, track=False):
"""recv a numpy array"""
md = socket.recv_json(flags=flags)
msg = socket.recv(flags=flags, copy=copy, track=track)
buf = np.buffer(msg)
A = numpy.frombuffer(buf, dtype=md['dtype'])
return A.reshape(md['shape'])
def handle_image_processing(frame, count):
frame_object=recv_array(socket)
tmp = np.zeros(frame_object.shape)
for i in range( 0, 1 ):
tmp[i,:] = tmp[i, :]
predictions_result = m2.predict( tmp )
label_vgg16 = decode_predictions( predictions_result )
print(label_vgg16)
检索错误 Traceback(最近一次调用最后一次):
handle_image_processing(frame,count)
File "C:/Pause-Resume-Approach-Updated/server-b.py", line 82, in handle_image_processing
frame_object=recv_array(socket)
File "C:/Pause-Resume-Approach-Updated/server-b.py", line 68, in recv_array
md = socket.recv_json(flags=flags)
File "C:\Users\learn\miniconda3\envs\tensorflow\lib\site-packages\zmq\sugar\socket.py", line 690, in recv_json
return self._deserialize(msg, lambda buf: jsonapi.loads(buf, **kwargs))
File "C:\Users\learn\miniconda3\envs\tensorflow\lib\site-packages\zmq\sugar\socket.py", line 515, in _deserialize
return load(recvd)
File "C:\Users\learn\miniconda3\envs\tensorflow\lib\site-packages\zmq\sugar\socket.py", line 690, in <lambda>
return self._deserialize(msg, lambda buf: jsonapi.loads(buf, **kwargs))
File "C:\Users\learn\miniconda3\envs\tensorflow\lib\site-packages\zmq\utils\jsonapi.py", line 54, in loads
s = s.decode('utf8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 17: invalid start byte
谢谢
【问题讨论】:
-
socket参数是什么类型的对象?您能否指出哪一行引发了异常和/或包含完整的回溯? -
谢谢@lenz,我已经更新了帖子。
-
看起来您使用
socket.send_json发送的消息不是(或不仅)您使用recv_json反序列化的消息。混合使用send和send_json发送的消息是一种好的模式吗?在服务器端区分这一点可能很棘手(如果有并发请求,对齐两个相应的消息也可能很棘手)。 -
@lenz 这两种方法 { .send(), .send_json() } 实际上都是用来填写一个和唯一一个消息信封(一个多帧的),所以你的假设服务器端必须做一些魔术来猜测哪些到达的消息流是以哪种方式加载的没有实现,但我和你一样怀疑使用上述方法的混合加载多帧消息 { .send (), .send_json(), ... } 原则上如何组成多方开放式分布式计算系统既安全又高效(需要更高效的映射+强大的防御)
标签: python numpy utf-8 zeromq pyzmq