这两天通过webservice来远程获取数据,刚开始没有注意到流量的问题,后来一试用,短短5天的时间花费了500M流量,这种流量在pc端还好
在移动端那简直就无法忍受,后来分析发现主要是以下问题:
1、webservice 的访问次数过多。
2、数据的重复获取
3、webservice 由于是基于soap协议,而soap协议是基于XML标签的,所以会有大量的冗余数据。
解决方法:
一、尽量减少webservice 的访问次数
现在很多应用因为业务的关系无法使用第三方推送,又不想自己搭建一个推送系统,故使用定时访问webservice的方法来获取所需数据,我们的
应用就是这样的,故根据自己的业务需要设计定时访问策略,如:在访问时间上做优化,如:晚上就不做访问或者少做访问,如果这一次获取到
数据,那么下一次访问的时间就自动延长,如果这一次没有获取到数据,那么下一次访问的时间就自动缩短,然后设置好最小与最大访问频率。
访问次数的减少能够根本的减少流量。
二、减少数据的重复获取
对所获取的数据进行排序标记,比如这一次获取到数据A的标号为5,那么下一次访问的时候就将这个5带上去,那么5以下的数据服务器就不再
重新返回。这样也能较为可观的减少流量。
三、对webservice数据进行压缩
这是最后一步优化的方法,如果以上两种方法都无法满足要求的话,那么这种方法才应该被想到。由于soap协议的性质,导致其传输数据的效率
很低,也就是如果要传输10个字节的数据,如果我们使用传统的socket方式来传输数据,可能只需要传输15个字节左右,但是使用soap协议则可
能需要100个字节。这就导致大量的流量被浪费。下面我给大家看一张测试服务器上的抓包图
我的IP为192.168.1.175,服务器的IP为192.168.1.231,刚开始我发送一个登录数据给服务器,然后服务器给我一个回复,我的登录数据为
username=4414000084password=123456,我们可以看到,当我将这两个数据发送给上去的时候,HTTP/XML 的包的大小为721个字节,然
后服务器给我回复了一个result=0或者1,可以看见花费了71个字节,传递一个用户名和密码总共也就不到50个字节(用户名和密码还需要进行标
记,故不能仅计算那串数字)却花费了721个字节,服务器回复的有效信息也就10个字节左右,却花费了71个字节,这样的有效性简直是太低了。
故想办法把这些发送的数据进行压缩也能够节省流量。
压缩办法:在客户端将数据分装成soap协议数据,然后压缩,服务器端接受到后进行解压,然后进行soap解析。这种方法我没有进行尝试,因
为仅客户端做出改变是没有作用的,必须服务器端进行配合。但是我比较好奇的是,如果需要这样进行操作的话,那还不如直接使用socket进行
数据访问,访问一次就断开,也不弄什么心跳长连接,这样应该也不会消耗多少流量,但是可能会加重服务器的压力。
以上就是android客户端访问webservice流量问题的解决方法。