I、让人烦躁的问题

近日,在移植Mina框架到Android上时,将已经做好的Demo客户端直接移植到Android工程后,启动原来的服务端,再启动Android客户端,总是提示无法建立连接(TCP 长连接),

debug跟踪后,发现建立连接后,获取的Session总是为null,log提示“failed to get session”

且在本地PC上抓包筛选127.0.0.1的消息,一个也没有,也就是说,连基本的TCP建立连接前的握手消息包都没有:

// 创建连接ConnectFuture future = connector.connect(new InetSocketAddress(127.0.0.1, PORT));// 等待连接创建完成future.awaitUninterruptibly();// 获得session,此处的session总是为nullsession = future.getSession();

但,相同的代码,在java客户端就没有问题,在移植到Android程序时,也在menifest中添加了相应的网络权限了,到底是怎么回事儿呢?一顿纠结 TT

II、真相

通过google 百度之后,发现原因出在Host地址上:127.0.0.1 !!!

话说,在一般的Java Web程序开发中,我们通常使用localhost或者127.0.0.1来访问本机的Web服务或Server,而localhost、127.0.0.1就是指运行程序的本地PC,即本机。

而对于Android模拟器来说,这两个地址的代表意义是什么呢?

让我们一起回想下,Android系统的本质:

Android本身就是一个OS,一个架设在Linux上的OS,那么在对于一个OS来说,localhost、127.0.0.1又代表的是什么?

对,是它自己。

所以,上面的代码在Android模拟器上运行后,它试图与自己(即:127.0.0.1,Android模拟器,而不是运行Server的本地PC)建立连接,显然,咱们的Server端压根就没放在模拟器上,而是运行模拟器的PC机上,所以建立连接失败,是显而易见的事情。

所以,这也解释了,为啥在PC端抓包连基本的握手都没有了,因为压根就没跟本地PC连,握手数据模拟器都发给它自己了。

III、干掉它的方法

既然知道原因了,那么,怎么让Android模拟器访问到PC上的Server端,有两种方法:

  • Host地址换成本地PC的IP地址(比如我的是:172.17.182.245)-----这是最直接的办法
  • 还有一种方法,这个比较取巧,我也是google baidu后,才学习的:在Android中,将我们本地PC的地址映射为10.0.2.2,因此,只需要将原先的 localhost或者127.0.0.1换成10.0.2.2,就可以在模拟器上访问本地计算机上的运行的Server或Web资源了。

个人推荐第一种方法,因为,这样将来放到真机张跑,代码就不用改了~呵呵,我比较懒~

IV、下次不幸再遇到时的排解方法

  • 首先,检查是否在menifest里面赋予应用程序访问网络的权限了?
<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
  • 其次,检查连接的IP地址,端口是否与Server启用的相同
  • 最后,检查代码是逻辑否有问题

V、参考资料

感谢各位的同行的泣血提携:

http://www.cnblogs.com/YOUCAN/archive/2012/09/14/2684691.html

http://blog.csdn.net/junjieking/article/details/6612557

希望下次再遇到类似问题,能做到秒杀大笑

更多相关文章

  1. Android10.0 系统解析(02)——搭建Android源代码编译调试环境
  2. Android 仿淘宝2017添加地址
  3. 移动开发者最爱的9个优秀Android代码编辑器
  4. Android Studio:如何使用Android Studio与夜神模拟器开发调试
  5. Eclipse与Android源码中ProGuard工具的使用(代码混淆)
  6. Anroid-vlc开源播放器代码编译及简单调用手把手
  7. 浅谈android代码保护技术_ 加固
  8. android 模拟器的使用(Android模拟器的一些工具)
  9. 《第一行代码Android》学习总结第七章 运行时权限

随机推荐

  1. [置顶] Android NDK开发轻松入门
  2. Android 消息处理机制(Looper、Handler、M
  3. Android 应用设计--- 无边界设计理念
  4. android应用程序基本原理
  5. android广告赚钱[转]
  6. 《Android Dev Guide》系列教程5:Android
  7. Adobe不再为Android提供Flash,移动Flash死
  8. Android(安卓)阴影问题汇总
  9. 实现了 Android 设备之间通过 Wifi 传输
  10. Android(安卓)工具:ADB 使用总结