第十二章:互联网-xmlrpc.client:XML-RPC的客户库-二进制数据

12.10.4 二进制数据
所有传递到服务器的值都会被编码,并自动转义。不过,有些数据类型包含的字符可能不是合法的XML。例如,二进制图像数据可能包括ASCII控制范围0到31中的字节值。要传递二进制数据,最好使用Binary类对其编码来传输。

import xmlrpc.client
import xml.parsers.expat

server = xmlrpc.client.ServerProxy('http://localhost:9000')

s = b'This is a string with control characters\x00'
print('Local string:',s)

data = xmlrpc.client.Binary(s)
response = server.send_back_binary(data)
print('As binary:',response.data)

try:
    print('As string:',server.show_type(s))
except xml.parsers.expat.ExpatError as err:
    print('\nERROR:',err)

如果将一个包含NULL字节的串传递到show_type(),那么XML解析器处理响应时会产生一个异常。
运行结果:
在这里插入图片描述
还可以利用pickle使用Binary对象发送对象。通过网络向可执行代码发送大量数据时,通常存在一些安全问题,这里也不例外(也就是说,除非通信通道是安全的,否则不要这么做)。

import xmlrpc.client
import pickle
import pprint


class MyObj:

    def __init__(self,a,b):
        self.a = a
        self.b = b

    def __repr__(self):
        return 'MyObj({!r},{!r})'.format(self.a,self.b)

server = xmlrpc.client.ServerProxy('http://localhost:9000')
o = MyObj(1,'b goes here')
print('Local:',id(o))
print(o)

print('\nAs object:')
pprint.pprint(server.show_type(o))

p = pickle.dumps(o)
b = xmlrpc.client.Binary(p)
r = server.send_back_binary(b)

o2 = pickle.loads(r.data)
print('\nFrom pickle:',id(o2))
pprint.pprint(o2)

Binary实例的数据属性包含对象的腌制版本,所以在使用之前必须解除腌制。这一步得到一个不同的对象(有一个新的ID值)。
运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值