手机网络通信渠道在开发中的运用

      本片文章出自http://blog.csdn.net/andywuchuanlong,转载请说明出处,谢谢!

      本篇文章将要讲述的是在项目开发中如何选择手机通信渠道,这所谓的通信就是指手机终端与服务器的数据交换,而渠道指的就是手机终端与服务器进行数据交换的方式。

      以Android项目开发为例,Android中可以使用的通信工具大概有以下几种:HttpUrlConnection、HttpClient、Socket等。但是是不是这些工具都可以应用于所有的渠道呢?

       手机的通信渠道有以下几种:

       1、WLAN:无线网络渠道,比如说wifi,当手机利用这种渠道方式上网,就会直接请求服务器。

       2、APN:手机apn接入点,就是基站,而这种接入点方式大概有两种:

            a) wap方式:这是一种地域性的渠道方式,主要用于增值业务,比如说中国移动的代理ip是10.0.0.172,端口是80,电信端口是200,。这种方式上网,经过wap网关(代理)的时候,运营商首先会拦截,过滤掉用户的请求,然后再转向真实的资源服务器。比平常的方式多了步骤,也就降低了上网的速度。走wap网关并不是所有的通信工具都是可以的。HttpUrlConnection貌似是不行的,网络稳定性非常的差。如果说在手机上网时候使用wap方式,就需要在代码中配置。

          b)Net方式,这种方式直接请求服务器。

     下面展示代码如何选择通信渠道。

     

    首先判断走的是哪种通信渠道?是wifi还是apn,apn中的wap特殊
    获取网络类型:WiFi or mobile,判断是哪个apn被选中了,获取apn的代理信息
          public static boolean checkNet(Context context) {
               // 判断:WIFI链接
               boolean isWIFI = isWIFIConnection(context);
               // 判断:Mobile链接
               boolean isMOBILE = isMOBILEConnection(context);
               // 如果Mobile在链接,判断是哪个APN被选中了
               if (isMOBILE) {
                    // APN被选中,的代理信息是否有内容,如果有wap方式
                    readAPN(context);// 判断是哪个APN被选中了
               }
               if (!isWIFI && !isMOBILE) {
                    return false;
               }
               return true;
          }
         
          /**
          * APN被选中,的代理信息是否有内容,如果有wap方式
          *
          * @param context
          */
          private static void readAPN(Context context) {
               Uri PREFERRED_APN_URI = Uri.parse("content://telephony/carriers/preferapn");//4.0模拟器屏蔽掉该权限
               // 操作联系人类似
               ContentResolver resolver = context.getContentResolver();
               // 判断是哪个APN被选中了
               Cursor cursor = resolver.query(PREFERRED_APN_URI, null, null, null, null);
               if(cursor!=null&&cursor.moveToFirst()){
                    GlobalParams.PROXY=cursor.getString(cursor.getColumnIndex("proxy"));
                    GlobalParams.PORT=cursor.getInt(cursor.getColumnIndex("port"));
               }
          }
 
          HttpClient中:设置代理信息         
          public HttpClientUtil() {
               client = new DefaultHttpClient();
               // 判断是否需要设置代理信息
               if (StringUtils.isNotBlank(GlobalParams.PROXY)) {
                    // 设置代理信息
                    HttpHost host = new HttpHost(GlobalParams.PROXY, GlobalParams.PORT);
                    client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, host);
               }
          }

      

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。