通过gevent websocket发送二进制数据

时间:2017-06-07 18:44:56

标签: python sockets websocket compression

我需要通过websocket发送一个包含几个大型Pandas Dataframe的pickle python字典(两端都是Python API)。为了提高性能,我想在通过websocket发送之前压缩pickle对象。但是,执行此操作时,收到的消息始终为“无”。

客户端:

df = pd.DataFrame({'a':[1,2,3,4]})
d = dict(b=df)
msg = zlib.compress(pickle.dumps(d),5)
socket.send(msg)

服务器:

msg = socket.receive()
# msg is always None when called with client code above.
data = pickle.loads(zlib.decompress(msg))

有更好的方法吗? 我通过Flask-Sockets框架使用gevent-websocket。

1 个答案:

答案 0 :(得分:1)

要在Python 2.7中发送二进制数据,您必须在客户端(ws4py)中设置binary=True

socket.send(msg, Binary=True)

另外请注意,在接收端,您需要在发送到zlib.decompress()之前将msg包装在缓冲区中

msg = socket.receive()
data = pickle.loads(zlib.decompress(buffer(msg)))