当前位置:  编程技术>移动开发
本页文章导读:
    ▪根治某“毒瘤”-手机GPRS下网有关问题        根治某“毒瘤”--手机GPRS上网问题 之前老是碰到手机不能上网(APN已经设置),今天调试之前写的程序,发现还是不能上网,google了一下,终于发现了问题。首先来看问题:引用在DownloadP.........
    ▪ SocketChannel 跟 DatagramChannel        SocketChannel 和 DatagramChannel SocketChannel  叫套接字通道,面向流,就是通常的TCP read,write 前必须建立连接,线程安全,任意时刻只能有一个线程进行读取和写入 DatagramChannel 叫数据报通道,面.........
    ▪ 搅混编译及参数说明       混淆编译及参数说明 之前我曾经写过一篇如何为用ADT创建的Android项目添加Proguard混淆支持的文章(为Eclipse ADT创建的android项目通过ant添加proguard混淆支持),当时我就说过,相信随着Google Andr.........

[1]根治某“毒瘤”-手机GPRS下网有关问题
    来源: 互联网  发布时间: 2014-02-18
根治某“毒瘤”--手机GPRS上网问题
之前老是碰到手机不能上网(APN已经设置),今天调试之前写的程序,发现还是不能上网,google了一下,终于发现了问题。

首先来看问题:
引用

在DownloadProvider  中有如下代码

 
HttpClient client = new DefaultHttpClient();
   HttpGet request = new HttpGet("xxx.xxx.xxx");
   request.setHeader("User-Agent", "some user agent");
   HttpResponse response = client.execute(request);

这段代码在WIFI和模拟器上下载东西没有问题,但是通过GPRS下载,response = client.execute(request); 这句代码报出“java.net.UnknownHostException: Host is unresolved:” 请问哪位大哥有建议。


再来读一段历史:

引用
朋友在对CMWAP和CMNET的区别还是不甚了解,导致了很多朋友在毫无知觉的情况下被扣了一大笔流量费,可真是心疼啊!对于一些新软件,也经常有人会问“CMWAP可以用吗?”,那么我们今天就来谈谈CMWAP和CMNET的主要区别与适用范围。

所谓cmwap和cmnet,这只是2G时代的一个特殊现象,也只是独具中国特色的一个现象。正如中移动人为将品牌划分为全球通、神州行和动感地带,只是为了区别而区别而已。葛优满大街的追着向人诉说:神州行,我看行。我看也行。品牌本无所谓,但当连小小的QQ都开始讲究“尊贵的钻石身份”的时候,那还有什么好说的?让无聊的我们就来无聊地研究研究这无聊的区别吧:

一、为什么会有两个接入点?

在国际上,通常只有一种GPRS接入方式,为什么在中国会有CMWAP和CMNET两兄弟呢?(彩信之所以单独配置接入点是因为彩信服务需要连接专用的服务器,在这里不作探讨。)

其实,CMWAP和CMNET只是中国移动人为划分的两个GPRS接入方式。前者是为手机WAP上网而设立的,后者则主要是为PC、笔记本电脑、PDA等利用GPRS上网服务。它们在实现方式上并没有任何差别,但因为定位不同,所以和CMNET相比,CMWAP便有了部分限制,资费上也存在差别。

cmwap从出发点上专为访问wap网站设计,当然你也可以访问www网站,可以登录QQ软件,但前提都是,你只能用http代理协议(80和8080端口)和wap网关协议(9201端口)。想用pop3收个Email?那基本是白想。所以,除非程序提供了使用http端口接入的方法,否则一般是上不了的。这也正是文章Google发布手机端Gmail软件的留言中,有那么多网友反映无法使用的原因,他们用移动梦网(cmwap)接入的,而Gmail软件并非用这个端口来连接服务器,所以无法使用。

cmnet无任何限制。它和我们用电脑正常接入互联网完全一样。

(1)wap接入点cmwap和cmnet有什么不同?

1、连网方式不同就是说通过cmwap的方式访问,需要走移动的网关通过http协议去连接,这样的后果就是速度会变慢,信很多朋友都用过代理服务器吧,就是那个感觉,但用手机的浏览器访问wap网站或使用网络功能,不会感觉到接入点的速度差别.因为手机本身处理速度有限制。而通过cmnet来连接的,就是直接连接到internet上的服务器,速度会比cmwap的快一些。如果用手机做猫,连接电脑上网时才会体现出来。cmwap速度会很慢,而有很多限制,甚至有的地区根本无法用cmwap连接电脑,cmnet是移动专门的提供无线网络服务的接入点,速度基本和电话拨号上网相当。CMNET和CMWAP是中国移动GPRS网络的两个不同APN(AccessPointName接入点名称)。CMNET提供了NAT服务,使用该服务的手机可直接访问internet。CMWAP只提供了WAP代理和HTTP代理,手机上网能访问的范围有限,接入时只能访问GPRS网络内的IP(10,*,*,*)。因此CMWAP主要用于手机WAP上网,CMNET则是用于PC,笔记本电脑,PDA等设备实现GPRS上网。两者手机上网的方式没有差别,如此划分是中国移动对手机上网服务对象的定位不同,所以他们的应用范围和资费标准不同。如果使用cmwap接入点的话,通过gprs连接后你所得到的一个IP地址是形如10.x.x.x,这个地址是一个A类地址。也就是俗称的内网地址。这个地址的访问收到很多限制。一般就是本子网内部。对于中国移动来说收到的限制就是只能访问中国移动wap网络。如果你使用cmnet接入点的话你得到的是一个形如202.xxx.x.x或者61.x.x.x之类的地址。这是一个c类地址。它可以自由的访问整个互联网上的任何网站。也就是说它和你的电脑上网的能力是一样的。正是这个区别造成了两者在资费上的差别。因为cmwap所需要的都是移动网络内部的流量。成本可以忽略不计算,而cmnet则需要中国移动为此而支付网间结算费用。所以要转嫁到你头上。但事实上这个费用远远低于你为此而付出的费用。所以移动才被列入暴利行业……扯远了。既然大家明白了区别也就自然明白了两个接入点所能提供的应用区别了。所以用cmwap只能访问服务器位于wap网内的网站或者使用提供服务的站位于wap网内的软件。例如掌迅通,10game之类。如果你用了cmnet。那么任何服务,网络,软件,都可以自由使用了。但是有人要说,我用cmwap挂代理也可以访问任何网站,这是什么原因呢?原因在于中国移动的彩信留下的一个大后门。其实这个不能称之为后门。因为它基本是一个公开的通道了。也就是10.0.0.172:80,这个地址移动自己称之为彩信网关,于这个网关承担了全网的彩信以及这么多的代理用。所以速度并不快,但也足以使用。可是移动也并不甘心被大家当代理用来连接电脑上网。因此也做了一定的封锁.但是封锁的技术并不高明。只是针对ie/maxthon等pc上的浏览器的标识符做了屏蔽。因为浏览器在访问站的时候会发出带有浏览器标识的数据包。移动可以通过这个来识别用户是用什么浏览器上网,进而做出封锁或者允许通过的决定。其目的就是只允许手机的浏览器通过这个网关。因为手机上的浏览器和pc上的是完全不一样的。所以绕过这个屏蔽的方法也很简单。就是修改一下注册表,让pc上的浏览器标识变化一下就解决了。同理一些手机上的浏览器也有一些补丁让原本被屏蔽的浏览器标识变成允许通过的浏览器标识。但是这个10.0.0.172的网关只支持80端口的应用,因此用cmwap直接实现http的代理是可行的。要实现其他业务如mail,udp等都无法做到。而cmnet就不受此限制。因为cmnet的c类地址端口是全开的。这时一些件企业就应运而生了。他们开发出一些软件。然后利用自己的服务器,替用户做http2sock的代理。当然这些是嵌在软件内部.用户是看不到的。用户所要做的就是开通gprs,然后用cmwap。安装这种软件就可以通过软件来进行IM,邮件,游戏等只有cmnet才可以享受的服务了。但是这种软件也有自己的局限性,只能针对他们所能提供的服务,而且有密码和关键信息泄漏之虞,因为用户需要把自己的账户信息完全通过软件服务器中转。因此如果你所需要的服务恰好有软件可以提供。那么你就可以轻松的享受低价cmwap包月带来的快乐了。如果没有这种软件,很不幸,那你就忍受cmnet的高价勒索吧。

2、资费不同各地cmwap一般10-20元包月,而cmnet一般是100-200元包月。如果仅仅是在手机上使用网络服务的话,选择cmwap包月无疑是最实惠的。

二、什么是WAP?WAP只是一种GPRS应用模式,它与GRPS的接入方式是无关的。WAP应用采用的实现方式是“终端+WAP网关+WAP服务器”的模式,不同于一般Internet的“终端+服务器”的工作模式。主要的目的是通过WAP网关完成WAP-WEB的协议转换以达到节省网络流量和兼容现有WEB应用的目的。WAP网关从技术的角度讲,只是一个提供代理服务的主机,它不一定由网络运营商提供。但据我所知,中国移动GPRS网络目前只有唯一的一个WAP网关:10.0.0.172

<over>


好吧,你终于明白了你不能”轻易“上网是因为某些官僚机构的历史问题导致。

下面是解决办法:

String testUrl = "http://www.ifanr.com/feed";
URL url = new URL(/blog_article/testUrl/index.html);
String tmpUrl = "http://10.0.0.172" + url.getPath();
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(tmpUrl);
request.setHeader("X-Online-Host", url.getHost());
request.setHeader("User-Agent", "some user agent");


Done. 世界终于太平了。。

    
[2] SocketChannel 跟 DatagramChannel
    来源: 互联网  发布时间: 2014-02-18
SocketChannel 和 DatagramChannel

SocketChannel  叫套接字通道,面向流,就是通常的TCP

read,write 前必须建立连接,线程安全,任意时刻只能有一个线程进行读取和写入

DatagramChannel 叫数据报通道,面向数据报,就是通常的UDP

send,receive 前无需建立连接,read,write前必须建立连接,线程安全,任意时刻只能有一个线程进行读取和写入


    
[3] 搅混编译及参数说明
    来源: 互联网  发布时间: 2014-02-18
混淆编译及参数说明
之前我曾经写过一篇如何为用ADT创建的Android项目添加Proguard混淆支持的文章(
为Eclipse ADT创建的android项目通过ant添加proguard混淆支持
),当时我就说过,相信随着Google Android的不断更新发展以及Eclipse ADT插件的不断改进,总有一天,做Android项目时能够和J2ME项目一样方便的一键打包混淆。现在新版的SDK和ADT就已经添加了这样的功能(SDK Tools中已经整合了Proguard的发行包,连这步配置都省了!),虽然还不是一键,但也就是小改一个配置文件的事,相对以前的手改ant xml build file的做法来说已经是极大的简化了添加混淆支持的难度了。

先说说我写这篇文章时用的开发环境:Eclipse 3.5.2+ADT 9.0.0+SDK Tools R9+SDK Platform-tools R2。

声明我不保证在其他版本的IDE ADT和SDK Tools下我的方法是否可行且不会产生问题!


有一个问题需要先注意一下,就是现在版本的SDK和ADT的整合Proguard混淆对有空格的SDK路径和项目路径支持不好,所以混淆之前先把空格路径的问题解决一下,虽然我记得之前的手改xml方法好像不太会有空格路径问题,不过这次还是不要在SDK和项目路径中出现空格为好,免得自找没趣。

其实在用比较新版的SDK和ADT创建Android项目时,你会发现生成的项目结构里多了一个以前没有的文件:proguard.cfg,这就是SDK整合了Proguard的一个重要标志(具体从哪版开始变成这样我还真没注意),有兴趣你可以打开看一下,做过原来ant xml方式混淆的朋友可以看出来这里面写的就是当初Proguard混淆target里的混淆设置参数,什么keep啊之类的,当时是要自己写,这次是SDK直接生成好了!

虽然有proguard.cfg,但是默认情况下,混淆是没有启用的,想打开混淆支持,只需要在default.properties中加入这样一段参数:proguard.config=proguard.cfg就可以了(注意:这个文件里的注释写着类似这个文件是自动生成的,所作修改可能会被覆盖等等,让把自定义的东西加到额外的build.properties里,其实也无所谓,盖了也就是一句话的事!),简单明了。

然后在执行项目打包apk时sdk就会自动添加Proguard混淆支持了,可以右键项目->Android Tools->Export Signed (或Unsigned)  Application Package…,生成的apk包可以用如apktool解包看看混淆效果。

PS:其实以前懒得弄Android混淆的一个原因是改xml太麻烦,加点外部lib就得更麻烦的加一些参数,同时还有另一个原因就是混淆的apk发布到market上,如果有用户的机器在程序出错时支持上传trace信息的话,那么你在market上看到的记录都是不可读的混淆后的名字,也是一件麻烦事。后来发现market上提了一句如果用proguard混淆后的apk可以有方法将trace信息反映射回去,成为可读信息的方法,查了一下,发现官方开发网站中就有提到,有兴趣的朋友可以研究一下:http://developer.android.com/guide/developing/tools/proguard.html (有墙,你懂),这样Proguard在Android上的实用性就更好了!


参数:

-include {filename}    从给定的文件中读取配置参数

-basedirectory {directoryname}    指定基础目录为以后相对的档案名称

-injars {class_path}    指定要处理的应用程序jar,war,ear和目录

-outjars {class_path}    指定处理完后要输出的jar,war,ear和目录的名称

-libraryjars {classpath}    指定要处理的应用程序jar,war,ear和目录所需要的程序库文件

-dontskipnonpubliclibraryclasses    指定不去忽略非公共的库类。

-dontskipnonpubliclibraryclassmembers    指定不去忽略包可见的库类的成员。


保留选项
-keep {Modifier} {class_specification}    保护指定的类文件和类的成员

-keepclassmembers {modifier} {class_specification}    保护指定类的成员,如果此类受到保护他们会保护的更好

-keepclasseswithmembers {class_specification}    保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。

-keepnames {class_specification}    保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)

-keepclassmembernames {class_specification}    保护指定的类的成员的名称(如果他们不会压缩步骤中删除)

-keepclasseswithmembernames {class_specification}    保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)

-printseeds {filename}    列出类和类的成员-keep选项的清单,标准输出到给定的文件

压缩
-dontshrink    不压缩输入的类文件

-printusage {filename}

-whyareyoukeeping {class_specification}    

优化
-dontoptimize    不优化输入的类文件

-assumenosideeffects {class_specification}    优化时假设指定的方法,没有任何副作用

-allowaccessmodification    优化时允许访问并修改有修饰符的类和类的成员

混淆
-dontobfuscate    不混淆输入的类文件

-printmapping {filename}

-applymapping {filename}    重用映射增加混淆

-obfuscationdictionary {filename}    使用给定文件中的关键字作为要混淆方法的名称

-overloadaggressively    混淆时应用侵入式重载

-useuniqueclassmembernames    确定统一的混淆类的成员名称来增加混淆

-flattenpackagehierarchy {package_name}    重新包装所有重命名的包并放在给定的单一包中

-repackageclass {package_name}    重新包装所有重命名的类文件中放在给定的单一包中

-dontusemixedcaseclassnames    混淆时不会产生形形色色的类名

-keepattributes {attribute_name,}    保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.

-renamesourcefileattribute {string}    设置源文件中给定的字符串常量
1 楼 kobe学java 2012-08-02  
proguard:
     [echo] Execute proguard class flies D:/java/android4.0.3/android-sdk-windows/proguard4.5.1/lib/proguard.jar
      [jar] Building jar: D:\java\project_book\HelloWorld\temp.jar
     [java] Error: Expecting class member name before '}' in argument number 9
D:\java\build\build-book.xml:140: Java returned: 1

我是ant打包的 出现了这个错
140行是<java jar="${proguard-home}/proguard.jar" fork="true" failonerror="true">

知道是什么原因吗?

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3