首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

正确地访问网络资源-Proxy的使用

2013-11-06 
正确地访问网络资源----Proxy的使用http://blog.csdn.net/sodino/article/details/6302313?天朝有很多独特

正确地访问网络资源----Proxy的使用

http://blog.csdn.net/sodino/article/details/6302313

?

天朝有很多独特的东西,今天要涉及到的是CMWAP与CMNET。

?

现在仍有许多Android手机用的是CMWAP连接网络的,如果只是简单滴使用URL.openConnection()开启一个HttpURLConnection,则会发现有一个UnknownHostException被抛出。唉...身为悲剧的程序员,就要开始解决这种bug了。

?

Sodino还发现一个现象,为什么自己的程序会崩掉,而Google浏览器就不会呢?与国产软件不同,国产软件身处天朝的软硬件环境下成长,可能会将代理IP(10.0.0.172)写进程序中,Sodino也确实反编译了几个程序后发现他们也是这样做来保持CMWAP下的正常联接。但是,Google浏览器可不是国人写的,那帮老外可不考虑天朝还有个CMWAP。那他们是如何保证网络的正常联接呢?一番鼓捣下,有了以下代码,可以在WIFI/CMWAP/CMNET/CTNET下正常访问网络,附带如何使用ping使用。

先上效果图:

正确地访问网络资源-Proxy的使用

?

?

[java]?view plaincopy?
  1. package?lab.sodino.network;??
  2. import?java.io.IOException;??
  3. import?java.io.InputStream;??
  4. import?java.net.HttpURLConnection;??
  5. import?java.net.InetSocketAddress;??
  6. import?java.net.MalformedURLException;??
  7. import?java.net.URL;??
  8. import?java.net.UnknownHostException;??
  9. import?android.app.Activity;??
  10. import?android.content.Context;??
  11. import?android.net.ConnectivityManager;??
  12. import?android.net.NetworkInfo;??
  13. import?android.os.Bundle;??
  14. import?android.os.Handler;??
  15. import?android.os.Message;??
  16. import?android.util.Log;??
  17. import?android.view.View;??
  18. import?android.widget.Button;??
  19. import?android.widget.TextView;??
  20. public?class?NetworkAct?extends?Activity?{??
  21. ????public?static?final?int?CLEAR_TEXT?=?0;??
  22. ????public?static?final?int?APPEND_TEXT?=?1;??
  23. ????private?TextView?txtInfo;??
  24. ????private?Button?btnPing;??
  25. ????private?Button?btnConnect;??
  26. ????private?Button?btnClear;??
  27. ????private?BtnListener?btnListener;??
  28. ????private?Handler?handler?=?new?Handler()?{??
  29. ????????public?void?handleMessage(Message?msg)?{??
  30. ????????????switch?(msg.what)?{??
  31. ????????????case?APPEND_TEXT:??
  32. ????????????????String?content?=?msg.obj.toString();??
  33. ????????????????txtInfo.setText("/n"?+?content);??
  34. ????????????????break;??
  35. ????????????case?CLEAR_TEXT:??
  36. ????????????????txtInfo.setText("");??
  37. ????????????????break;??
  38. ????????????}??
  39. ????????}??
  40. ????};??
  41. ????public?void?onCreate(Bundle?savedInstanceState)?{??
  42. ????????super.onCreate(savedInstanceState);??
  43. ????????setContentView(R.layout.main);??
  44. ????????btnListener?=?new?BtnListener();??
  45. ????????txtInfo?=?(TextView)?findViewById(R.id.txtInfo);??
  46. ????????btnPing?=?(Button)?findViewById(R.id.btnPing);??
  47. ????????btnPing.setOnClickListener(btnListener);??
  48. ????????btnConnect?=?(Button)?findViewById(R.id.btnConnect);??
  49. ????????btnConnect.setOnClickListener(btnListener);??
  50. ????????btnClear?=?(Button)?findViewById(R.id.btnClear);??
  51. ????????btnClear.setOnClickListener(btnListener);??
  52. ????}??
  53. ????/**?
  54. ?????*?@param?param?
  55. ?????*????????????指定的域名如(www.google.com)或IP地址。?
  56. ?????*/??
  57. ????private?void?doPing(final?String?param)?{??
  58. ????????new?Thread()?{??
  59. ????????????public?void?run()?{??
  60. ????????????????String?line?=?"";??
  61. ????????????????InputStream?is?=?null;??
  62. ????????????????try?{??
  63. ????????????????????line?=?"/nping?-c?1?"?+?param;??
  64. ????????????????????//?-c?1:表示ping的次数为1次。??
  65. ????????????????????Process?p?=?Runtime.getRuntime().exec("ping?-c?1?www.google.com");??
  66. ????????????????????//?等待该命令执行完毕。??
  67. ????????????????????int?status?=?p.waitFor();??
  68. ????????????????????if?(status?==?0)?{??
  69. ????????????????????????//?正常退出??
  70. ????????????????????????line?+=?"Pass";??
  71. ????????????????????}?else?{??
  72. ????????????????????????//?异常退出??
  73. ????????????????????????line?+=?"Fail:?Host?unreachable";??
  74. ????????????????????}??
  75. ????????????????????is?=?p.getInputStream();??
  76. ????????????????????byte[]?data?=?new?byte[is.available()];??
  77. ????????????????????is.read(data);??
  78. ????????????????????line?+=?"/n"?+?new?String(data);??
  79. ????????????????}?catch?(UnknownHostException?e)?{??
  80. ????????????????????line?+=?"Fail:?Unknown?Host";??
  81. ????????????????}?catch?(IOException?e)?{??
  82. ????????????????????line?+=?"Fail:?IOException";??
  83. ????????????????}?catch?(InterruptedException?e)?{??
  84. ????????????????????line?+=?"Fail:?InterruptedException";??
  85. ????????????????}??
  86. ????????????????Message?msg?=?new?Message();??
  87. ????????????????msg.what?=?APPEND_TEXT;??
  88. ????????????????msg.obj?=?line;??
  89. ????????????????handler.sendMessage(msg);??
  90. ????????????}??
  91. ????????}.start();??
  92. ????}??
  93. ????private?void?go2Network()?{??
  94. ????????new?Thread()?{??
  95. ????????????public?void?run()?{??
  96. ????????????????String?line?=?"";??
  97. ????????????????URL?url?=?null;??
  98. ????????????????HttpURLConnection?httpConn?=?null;??
  99. ????????????????InputStream?is?=?null;??
  100. ????????????????try?{??
  101. ????????????????????url?=?new?URL("http://www.sodino.com/index.html");??
  102. ????????????????????//?Log.d("ANDROID_LAB",?"Protocol="?+?new??
  103. ????????????????????//?URL("https://www.sodino.com").getProtocol());??
  104. ????????????????????//?需要android.permission.ACCESS_NETWORK_STATE??
  105. ????????????????????NetworkInfo?networkInfo?=?((ConnectivityManager)?getSystemService(Context.CONNECTIVITY_SERVICE))??
  106. ????????????????????????????.getActiveNetworkInfo();??
  107. ????????????????????//?如果是使用的运营商网络??
  108. ????????????????????if?(networkInfo.getType()?==?ConnectivityManager.TYPE_MOBILE)?{??
  109. ????????????????????????//?获取默认代理主机ip??
  110. ????????????????????????String?host?=?android.net.Proxy.getDefaultHost();??
  111. ????????????????????????//?获取端口??
  112. ????????????????????????int?port?=?android.net.Proxy.getDefaultPort();??
  113. ????????????????????????if?(host?!=?null?&&?port?!=?-1)?{??
  114. ????????????????????????????line?+=?"/nhost["?+?host?+?"]?port["?+?port?+?"]";??
  115. ????????????????????????????//?封装代理連接主机IP与端口号。??
  116. ????????????????????????????InetSocketAddress?inetAddress?=?new?InetSocketAddress(host,?port);??
  117. ????????????????????????????//?根据URL链接获取代理类型,本链接适用于TYPE.HTTP??
  118. ????????????????????????????java.net.Proxy.Type?proxyType?=?java.net.Proxy.Type.valueOf(url??
  119. ????????????????????????????????????.getProtocol().toUpperCase());??
  120. ????????????????????????????java.net.Proxy?javaProxy?=?new?java.net.Proxy(proxyType,?inetAddress);??
  121. ????????????????????????????httpConn?=?(HttpURLConnection)?url.openConnection(javaProxy);??
  122. ????????????????????????}?else?{??
  123. ????????????????????????????httpConn?=?(HttpURLConnection)?url.openConnection();??
  124. ????????????????????????}??
  125. ????????????????????}?else?{??
  126. ????????????????????????httpConn?=?(HttpURLConnection)?url.openConnection();??
  127. ????????????????????}??
  128. ????????????????????httpConn.connect();??
  129. ????????????????????int?length?=?httpConn.getContentLength();??
  130. ????????????????????byte[]?data?=?new?byte[length];??
  131. ????????????????????String?encoding?=?httpConn.getContentEncoding();??
  132. ????????????????????line?+=?"/nlength="?+?length?+?"?encoding="?+?encoding;??
  133. ????????????????????is?=?httpConn.getInputStream();??
  134. ????????????????????is.read(data);??
  135. ????????????????????String?content?=?null;??
  136. ????????????????????if?(encoding?!=?null)?{??
  137. ????????????????????????content?=?new?String(data,?encoding);??
  138. ????????????????????}?else?{??
  139. ????????????????????????content?=?new?String(data);??
  140. ????????????????????}??
  141. ????????????????????line?+=?"/nContent[/n"?+?content?+?"/n]";??
  142. ????????????????????Message?msg?=?new?Message();??
  143. ????????????????????msg.what?=?APPEND_TEXT;??
  144. ????????????????????msg.obj?=?line;??
  145. ????????????????????handler.sendMessage(msg);??
  146. ????????????????}?catch?(IOException?ie)?{??
  147. ????????????????????ie.printStackTrace();??
  148. ????????????????}?finally?{??
  149. ????????????????????try?{??
  150. ????????????????????????if?(is?!=?null)?{??
  151. ????????????????????????????is.close();??
  152. ????????????????????????}??
  153. ????????????????????????if?(httpConn?!=?null)?{??
  154. ????????????????????????????httpConn.disconnect();??
  155. ????????????????????????}??
  156. ????????????????????}?catch?(IOException?ie)?{??
  157. ????????????????????????ie.printStackTrace();??
  158. ????????????????????}??
  159. ????????????????}??
  160. ????????????}??
  161. ????????}.start();??
  162. ????}??
  163. ????class?BtnListener?implements?Button.OnClickListener?{??
  164. ????????public?void?onClick(View?view)?{??
  165. ????????????if?(view?==?btnPing)?{??
  166. ????????????????//?doPing("www.google.com");??
  167. ????????????????doPing("10.0.0.172");??
  168. ????????????}?else?if?(view?==?btnConnect)?{??
  169. ????????????????go2Network();??
  170. ????????????}?else?if?(view?==?btnClear)?{??
  171. ????????????????Message?msg?=?new?Message();??
  172. ????????????????msg.what?=?CLEAR_TEXT;??
  173. ????????????????handler.sendMessage(msg);??
  174. ????????????}??
  175. ????????}??
  176. ????}??
  177. }??

?

?

如此,悲剧的程序员解决了不同网络状态下如何保证正常链接的问题。

最后补充下:Android手机在CMWAP上要能够正常上网,除了设置一大堆代理数据外,还需进入拨号器下按"*#*#4636#*#*"→Phone Information下拉到最后后有个“Toggle DNS Check”,将其设置为allow

热点排行