`

如何让Android模拟器能访问到本地Server或Web应用(即:运行模拟器的PC)

 
阅读更多

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总是为null
session = 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 楼 绿茵好莱坞 2017-09-21  
好文 ,值得学习

相关推荐

    web前端开发笔记 边读边写学前端开发

    在PC端软件与移动App之间,App是安装在移动设备上的应用程序,可以分为原生App(使用原生语言如Android或iOS开发)、WebApp(在浏览器中运行的Web应用)和Hybrid App(结合了原生与WebApp特点的混合应用)。...

    安卓 一个简单新闻系统的服务器和客户端

    - **Tomcat**:作为应用服务器,Tomcat运行和部署Java Servlet和JavaServer Pages(JSP)应用程序。在这个新闻系统中,MyEclipse开发的服务器端代码会被打包成WAR文件并部署到Tomcat上,以供客户端访问。 2. **...

    adb1.0.26包含fastboot.exe

    adb 的运行原理是 PC 端的 adb server 与手机端的守护进程 adbd 建立连接,然后 PC 端的 adb client 通过 adb server 转发命令,adbd 接收命令后解析运行。 所以如果 adbd 以普通权限执行,有些需要 root 权限才能...

    基于Android平台的图书管理系统毕业设计论文

    传统 WEB 应用只能在 PC 机上使用,不能做到随时随地的使用,为了解决这样的不足,基于 Android 平台的图书馆管理系统客户端就应运而生。本设计阐述了在 Android 平台下图书馆管理系统的设计与实现过程,其目的是让...

    基于Android平台的图书管理系统设计与实现.doc

    传统WEB应用只能在PC机上使用,不能做到随时随地的使用,为了解决这样的不足,基于Android平台的图书馆管理系统客户端就应运而生。本设计阐述了在Android平台下图书馆管理系统的设计与实现过程,其目的是让人们能够...

    毕业设计论文-基于Android平台的图书管理系统手机客户端开发.doc

    本文主要讲述了基于Android平台的图书管理系统手机客户端的开发,旨在解决传统WEB应用只能在PC机上使用的不足。该系统采用C/S结构,MVC软件开发模式,使用Android布局技术完成UI的设计,基于Java语言开发完成。在...

    基于Android平台的图书管理系统手机客户.doc

    在不同型号的设备模拟器上进行测试,确保了该应用能在多种Android设备上正常运行。 系统功能包括用户注册、登录、图书查询以及学生用户管理和图书管理。用户注册功能允许新用户创建自己的账户,登录功能则验证用户...

    基于Android平台的图书管理系统毕业论文.doc

    传统的WEB应用局限于个人电脑(PC)使用,无法满足用户随时随地获取信息的需求。为弥补这一不足,开发者开始探索将服务拓展到移动设备上,特别是在Android操作系统占据主导地位的背景下。基于Android平台的图书管理...

    基于android平台的图书管理系统.doc

    本系统充分利用了Android操作系统的优势,使得用户可以在任何时间、任何地点享受图书管理服务,打破了传统WEB应用局限于PC使用的局限。 一、系统架构与设计 该系统采用C/S(客户端/服务器)架构,结合MVC(模型-...

    java外包源码-Priya.InfoList:可部署在Android/IOS/PC/Server/EC2/PAAS上的Arshu跨平台混合应

    签名和压缩对齐并部署到设备/模拟器。 请注意,这不能用于打包 C# 应用程序,因为您需要使用 Xamarin Mono for Android 配置文件对其进行编译。 如果您需要此功能,请联系我,以便我可以帮助您配置开发环境以启用...

    【最新版】wechat_devtools_1.02.2004020.dmg【亲测可用】最好的微信开发者工具

    F 修复 PC 端模拟器的 touchend 事件回调参数 changedTouches 为空的问题 反馈详情 2020.03.25 更新说明 A 新增 云开发控制台支持开通按量付费 A 新增 云开发支持数据库备份与回档(还原)详情 A 新增 支持小...

Global site tag (gtag.js) - Google Analytics