Android:网络层通信的处理

来源:互联网 发布:用友t3恢复数据在哪里 编辑:程序博客网 时间:2024/05/20 06:52


Android的网络编程分为2,一个是基于http协议的,一个是基于socket,关于网络编程和httpsocket网络协议通过我的项目中做的项目框架的网络层进行分析)与服务器通信的常用实现方式,一般使用三种,HttpURLConnection、HttpClient还有Socket通信,这里要考虑我们手机端有哪些通信渠道可以使用,手机端的通信渠道,一个是通过wifi,另一个是通过手机APN接入点(基站),wifi的覆盖范围一般有百米左右,而基站一般是1~2公里。利用基站有两种方式,wapnet

遇到的问题:使用HttpURLConnectionwap方式下跑的时候,由于移动代理的服务器是有地域性的,比如说北京有一台服务器,而上海也有一台服务器,虽然这两台服务器的端口一样,但是它们是由不同的人员来维护的,这就有可能产生一些差距,我们的应用在北京的时候使用很正常,再把这个应用拿到上海去,通过wap方式访问的时候,成功率就会很低,而且每次产生的错误可能不一样,这种错误是很难调的,没有规律性,而我们的应用是要在全国推广的,所以这种错误是不允许的。

解决的办法:如果不使用HttpURLConnection,而改用HttpClient这个框架的时候,问题就可以避免了。HttpClient的稳定性明显好的多,所以以后的应用也都改使用HttpClient框架。

与服务器通信还有一种方式就是使用socket,关于socket有个知识点很重要就是socket长连接。

Socket有两种方式,TCP/UDP,这两种方式在手机端应用很广,比如说豌豆荚类的手机助手软件,它的通信方式有USBwifi,还有一部手机助手用的是蓝牙的,这些工具是怎么做的呢?

比如说豌豆荚这个软件网电脑上一装,把手机端通过USB接进来,PC端就会很智能的安装驱动,我们知道在windows系统下,如果不安装驱动,手机是连接不上的。而在linux下是不用安装驱动的。Windows下之所以能很智能的安装驱动,是因为USB一连上就能够读取PIDVID信息,一个是厂家的唯一标识,一个是版本的唯一标识,通过这两个就知道你手机的信息,(PID还有一个含义是进程ID也就是进程标识符,操作系统里每打开一个程序,都会创建一个进行ID,也就是这个PID),这些信息一旦你读到后,你就可以到数据库中去查,去查查这个厂家是不是生产手机的,去看看是这个厂家生产的手机的哪个版本。这些信息有,再去找应用安装驱动就容易了,而这个驱动装上之后,就可以利用USB使用手机端和PC端进行通信。

Wifi就更简单了,当你的手机接入到局域网的时候,它就会等着,等着什么呢?比如一台电脑上安装了豌豆荚这个应用,当这个应用启动的时候,就会使用UDP的方式往这个局域网中的所有IP上扔一个数据包,如果你手机上安装了这个应用,就会获取到这个数据包,而且这个数据包是手机端能处理的,因此手机端就会和PC端建立连接,连接建立好之后,就可以传输数据了。

蓝牙也是一样的,它有一个专门的工具叫BlueToothSocketbluetoothsocket类不仅可以在手机助手软件可以使用,而且可以在大数据量实时传输的时候使用,比如像一些贵金属的交易平台还有一些股票交易的平台,他们的数据量就非常大,而且是不允许延迟的,像股票这样的,一旦延迟,就出事儿了,这时可以使用bluetoothsocket这个api。还有在小数据量实时性不强的地方也会使用到,比如说消息推送还有精准营销,比如我在一个商城中买了一件东西,那么在服务器端就会记录谁谁谁在某个时间买了什么东西,所买的东西的信息,当在服务器端记录了这些信息之后,精准营销的做法是:当所买的东西这一类的商品有促销信息的时候,它会从服务器端把这些信息比对一下,然后把这些信息发个你,因为你以前买过。这样处理的原理是什么呢?画图说明,手机端和服务器端,如果说每次访问服务器都要建立连接,访问后断开连接,而下一次再访问的时候再建立连接、断开连接,再加上传输数据,这样消耗的时间就会很多,这时候,我的处理方法是,建立一个连接通道,建立好之后,就不关掉(close掉它)了,但是这时候,手机在底层会做这样的一件事儿,当连接空闲的时候,比如说一分钟,通常我们也会遇到这个问题,我们用手机应用访问网络的时候,等着一段时间就会出现timeout时间超时这个问题,也就是说,如果我们建立的这个连接通道如果不关的话,就会被回收掉。考虑到这个问题,我的处理方式,使用长连接,长连接的思路是这样子的,建立这个连接通道,每隔一段时间就会给服务器发送一个数据包,骚扰一下服务器,这个时间段不能大于1分钟,发送的数据包的大小也要很小,比如1个字节,目的就是保持这个通道的畅通,而服务器端在收到这个数据包的时候也会返回一个数据包,当手机端收到这个数据包的时候,就说明这个通道是畅通无阻的。

使用socket长连接还有一个问题需要注意,我们知道手机和服务器端通信的话,是要通过基站传输的,如果一个人拿着手机从一个基站 下跑到了另一个基站下,那么这个连接通道就会断开了,会在另一个基站下重新连接,所以手机处理socket长连接的机制不是这么简单,我了解过,能在以后的开发中根据一些资料来运用。长连接处理的是大数据量的实时传输。

而对于小数据量的,实时性不强的,这时候用到的,画图说明,手机端和服务器端,如果是在服务器端找手机,是找不到的,只能找到局域网分配给这个手机的ip,拿到这个ip是没用的,但是在基站下面会找到手机的位置,但是这样是很消耗资源的,服务器要想直接对手机端进行消息推送是不行的,我的解决办法是,在手机端,利用socketUDP方式每隔一段时间就向服务器端发送数据包,由于数据量很小,实时性也不强,因此这里的时间间隔就不用那么短,像精准营销,我们每半天发送一个就不少了,每隔半天向服务器发送一个数据包,服务器就会处理,检查这时候是否有促销信息,如果有的话就会给、手机端发送这个信息,消息推送的原理也是这样的。

分析完与服务器端的通信方式和通信渠道之后,我就使用HttpClient实现与服务器端的通信,之所以使用它,是因为它的稳定性好。

首先我要判断手机通信的渠道,看是wifiwap还是net,我在代码里建立了一个工具类NetUtil,用于判断网络的类型,在这个类里面先判断是wifi还是apn,如果都不是就要提示用户去配置网络,如果是apn这种方式,就要判断是wap还是net,如果是wap,就要去设置ip和端口。怎么判断是wap还是net呢?读取当前连接的apn信息,看ip和端口是否有值,使用到ConnectivityManager类中判断网络类型的方法。

 

0 0