热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android产品研发(九)>App网络传输协议

转载请标明出处:一片枫叶的专栏上一篇文章中我们讲解了如何在App中统计数据,其实现主要分为两种:使用第三方服务统计和自身实现数据统计。一般而言我们使用第三方统计服务已经可以很好的满

转载请标明出处:一片枫叶的专栏

上一篇文章中我们讲解了如何在App中统计数据,其实现主要分为两种:使用第三方服务统计和自身实现数据统计。一般而言我们使用第三方统计服务已经可以很好的满足我们的也无需求了,只有部分数据敏感型的App,由于其数据敏感性在app中实现数据统计服务是一个更好的选择,更多关于App数据统计相关的内容可参考我的:Android产品研发(八)–>App数据统计。

而本文将要介绍的是App的网络传输协议。App与服务器交互就会涉及到信息的交换,而信息的交互就必然需要一套完整的数据协议。这里首先需要明确一点的是什么是网络传输协议呢?这里首先套用一段百度百科的定义:

网络传输协议或简称为传送协议(Communications Protocol[1] ),是指计算机通信的共同语言。现在最普及的计算机通信为网络通信,所以“传送协议”一般都指计算机通信的传送协议,如TCP/IP、NetBEUI等。然而,传送协议也存在于计算机的其他形式通信,例如,面向对象编程里面对象之间的通信;操作系统内不同程序之间的消息,都需要有一个传送协议,以确保传信双方能够沟通无间。

简单而言网络传输协议就是App端与服务器端交互的时候约定好的内容格式。比如我们常见的Json格式,xml格式等,这些都是网络传输协议,而现在在App开发中比较常见的网络传输协议有三种:xml,json,protobuf

而我们下面将分别分析其各自的使用利弊以及解析方案。

– 网络传输协议-XML

xml是一种最早的网络传输协议,常见于java web开发中,不单单作为网络层的参数协议,还常见于各种配置文件中,在移动开发中也常见但是已不是主流的网络传输协议。

优点:可读性强,解析方便;
缺点:效率不高,资源消耗过大;
解析方式:DOM解析,SAX解析,PULL解析;

(1)DOM解析:
解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)
(2)SAX解析:
SAX ,事件驱动型解析方式。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载。缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少;
(3)PULL解析:
PULL解析方式是Android专门为移动设备上解析XML文件而设计的一种解析方式,显而易见的其更加适用于移动设备解析xml文件。Pull解析和Sax解析很相似,Pull解析和Sax解析不一样的地方是pull读取xml文件后触发相应的事件调用方法返回的是数字还有pull可以在程序中控制想解析到哪里就可以停止解析。

– 网络传输协议-JSON

JSON是在移动端比较常见的网络传输协议,它较xml格式更叫的简单和“小”,因此比xml更适合移动端对流量和内存的控制。

优点:较XML格式更加小巧;
缺点:传输效率也不是太别高,但相较于xml提高了很多;
解析方式:Gson解析,JSONObject方式解析,FastJson解析

(1)Gson解析:
Gson解析方式是Google开源的一套解析方式,通过提供的Gson jar包,通过静态方法直接由字符串解析成java对象,简单方便。
具体使用方法,可参考:Google Gson 使用简介

(2)JSONObject解析:
JSONObject在org.json下面的包中,其也是一个解析Json字符串的工具类,具体使用方式可参考:JSONObject与JSONArray的使用

(3)FastJson解析:
FastJson是阿里巴巴开源的一个解析Json数据的类库,能够将json字符串解析成java对象。这里有其介绍,英文水平不好就不献丑了…

  • Provide best performance in server side and Android client.

  • Provide simple toJSONString() and parseObject() methods to convert Java objects to JSON and vice-versa

  • Allow pre-existing unmodifiable objects to be converted to and from JSON

  • Extensive support of Java Generics

  • Allow custom representations for objects

  • Support arbitrarily complex objects (with deep inheritance hierarchies and extensive use of generic types)

– 网络传输协议-ProtoBuf

ProtoBuf是Google开源的一套二进制流网络传输协议,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。

优点:传输效率快(比xml和json快10-20倍),文档型协议;
缺点:使用不太方便;

这里简单解释一下什么是文档型协议,向我们的xml和json一般在使用的时候都需要保存一份说明文档和一个实际的java类,而protobuf在使用的时候其定义的格式就是说明文档,简单明了而且可以将其编译成各个平台的类库,以java平台为例,其编程成jar之后,若定义文件发生了变化,则在使用jar包的话就会报错,必须重新编译,这也就保证了App端与服务器端的协议统一性。

网络传输协议实践

由于ProtoBuf的传输效率和文档型协议的特性,公司产品选择了Protobuf作为网络传输协议。下面我就以一个简单的登录操作,介绍一下对ProtoBuf的实际应用。

(1)定义ProtoBuf文件
《Android产品研发(九)-->App网络传输协议》&#8221; /></p><p>(2)定义登录网络操作请求接口</p><p><code>// 提交短信验证码,如果该手机号码没有注册过,则直接给用户注册<br>message SmsLogin {<br>    message Request {<br>        required string phOne= <span>1</span><span>; // 手机号码</span><br>        required string verifyCode = <span>2</span><span>; // 验证码</span><br>    }<br>    message Response {<br>        <span>/* * 0:成功;-1:登录失败;-2:验证码错误;-3:验证码已经失效;-4:手机号码格式不正确;-5:不是内测用户不能登录 */</span><br>        required int32 <span>ret</span> = <span>1</span><span>;</span><br>        optional <span>com</span><span>.uu</span><span>.facade</span><span>.passport</span><span>.pb</span><span>.bean</span><span>.UserAppSessionTicket</span> sessiOnTicket= <span>2</span><span>;</span><br>        optional string phOne= <span>3</span><span>; // 手机号码</span><br>        optional string imgUrl = <span>4</span><span>; // 用户图像url</span><br>        optional <span>com</span><span>.uu</span><span>.facade</span><span>.base</span><span>.common</span><span>.UserStatus</span> userStatus = <span>5</span><span>; // 用户状态</span><br>    }<br>}</code></pre><p>可以看到在Protobuf中定义网络请求,分为两个部分,请求部分和应答部分,其message request定义的是请求信息,而message response定义的是应答信息。 <br /> 请求信息中的字段就是我们请求中需要传递的字段,应答信息中的字段就是App端获取的服务器端的应答信息集合。</p><p>每个字段都有修饰符,那么修饰符是做什么的呢? <br /> 在protobuf中定义了三种修饰符,分别为:required,optional,repeated。其中:</p><ul><li><p>required:表示的是这个字段必须要传递,不可为空;</p></li><li><p>optional:表示的是这个字段可传可不传,可以为空;</p></li><li><p>repeated:表示这个字段传递的是列表数据</p></li></ul><p>在message的定义过程中,message还可以嵌套另外的message信息,比如应答信息中的UserStatus,其和java中对象的概念很类似。</p><p>(3)将proto文件编译成jar包 <br /> 这里就不在具体介绍怎么讲proto文件编译成jar了,google已经提供了相应的编译工具。</p><p>(4)在Android代码中使用 <br /> 由于我们将proto文件编译成了jar包,首先我们需要将jar引入到我们的工程,然后就可以使用了。这里简单看一下具体的使用代码。</p><p><code><span>/** * 请求服务器短信登陆 * *<span> @param</span> phone *<span> @param</span> code */</span><br>    <span>private</span> <span>void</span> <span>requestSmsLogin</span>(String phone, String code) {<br>        showProgress(<span>false</span>);<span>// 显示进度条</span><br>        LoginInterface.SmsLogin.Request.Builder request = LoginInterface.SmsLogin.Request.newBuilder();<br>        request.setPhone(phone); <span>// 设置手机号</span><br>        request.setVerifyCode(code); <span>// 设置验证码</span><br>        NetworkTask task = <span>new</span> NetworkTask(Cmd.CmdCode.SmsLogin_SSL_VALUE);<br>        task.setBusiData(request.build().toByteArray());<br>        NetworkUtils.executeNetwork(task, <span>new</span> HttpResponse.NetWorkResponse<UUResponseData>() {<br>            <span>@Override</span><br>            <span>public</span> <span>void</span> <span>onSuccessResponse</span>(UUResponseData responseData) {<br>                <span>if</span> (responseData.getRet() == <span>0</span>) {<br>                    <span>try</span> {<br>                        <span>// 显示通用下发消息</span><br>                        showResponseCommonMsg(responseData.getResponseCommonMsg());<br>                        <span>// 解析请求应答信息</span><br>                        LoginInterface.SmsLogin.Response respOnse= LoginInterface.SmsLogin.Response.parseFrom(responseData.getBusiData());<br>                        <span>// 判断是否请求成功</span><br>                        <span>if</span> (response.getRet() == <span>0</span>) {<br>                            ...doSomeThing()...<br>                        }<br>                    } <span>catch</span> (Exception e) {<br>                        e.printStackTrace();<br>                        showDefaultNetworkSnackBar();<br>                    }<br>                }<br>            }<br>            <span>@Override</span><br>            <span>public</span> <span>void</span> <span>onError</span>(VolleyError errorResponse) {<br>                showDefaultNetworkSnackBar();<br>            }<br>            <span>@Override</span><br>            <span>public</span> <span>void</span> <span>networkFinish</span>() {<br>                <span>// 取消进度条显示</span><br>                dismissProgress();<br>            }<br>        });<br>    }</code></pre><p>可以发现我们在代码中直接有对应的登录请求message类,这样我们就可以直接通过java类调用了,O(∩_∩)O哈哈~。</p><p><strong>总结:</strong></p><p>本文主要介绍了App开发过程中常见了三种网络传输协议,以及各自的优劣势,还重点介绍了protobuf协议的使用方式等。大家在选择的时候可以根据具体的产品需求来确定到底选择哪一个,当然了这里我还是比较推荐protobuf的。</p><p>另外对产品研发技术,技巧,实践方面感兴趣的同学可以参考我的: <br /> Android产品研发–>总结(持续更新) <br /> Android产品研发(一)–>实用开发规范 <br /> Android产品研发(二)–>启动页优化 <br /> Android产品研发(三)–>基类Activity <br /> Android产品研发(四)–>减小Apk大小 <br /> Android产品研发(五)–>多渠道打包 <br /> Android产品研发(六)–>Apk混淆 <br />  Android产品研发(七)–>Apk热修复 <br /> Android产品研发(八)–>App数据统计</p><p><strong>本文以同步至github中:https://github.com/yipianfengye/AndroidProject,欢迎star和follow</strong></p>        <br>
        <script type= var cpro_id = "u6885494";

推荐阅读
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 解决java.lang.IllegalStateException: ApplicationEventMulticaster not initialized错误的方法和原因
    本文介绍了解决java.lang.IllegalStateException: ApplicationEventMulticaster not initialized错误的方法和原因。其中包括修改包名、解决service name重复、处理jar包冲突和添加maven依赖等解决方案。同时推荐了一个人工智能学习网站,该网站内容通俗易懂,风趣幽默,值得一看。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
author-avatar
zoey小
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有