Android客户端和服务器通信
本文转载自http://chriszz.sinaapp.com/?p=397
本文目的:通过模拟器、真机分别连接本地Tomcat服务器,实现数据交互
本人环境:Fedora20、MyEclipse2013(带tomcat)、ADT Bundle(eclipse+sdk)
注意事项:电脑和手机连接同一路由器,不需要在防火墙开启8080端口;但如果手机连接到电脑开启的无线局域网(wlan),那么需要在防火墙中开启8080端口
Android客户端经常需要和网络打交道,比如调用地图API、天气API、和自己搭建的服务器通信等。API的调用比较容易,都是现成的;如果需要自己搭建服务器的,那么开发和测试的时候就该相互通信。
比如,我选择用Tomcat作为服务器,建立了相应的Web Project并部署到Tomcat。然后我建立了安卓应用,最简单的通信是安卓这边根据一个String格式的url,获取你的Web Project中的某个页面。
首先,我们来测试安卓端获取url对应页面html的代码。假设http://www.baidu.com就是我们自己的服务器上部署的一个页面(只要你有连接网络,就一定能访问),我们在android中设定一个textview用来显示获取到的html,那么完整的MainActivity.java该怎样写?由于在安卓4.0之后严格要求主线程中不允许发送HTTP请求,这是为了避免应用的ANR(aplication Not Response)异常。我们可以通过监听器搞定:
public class MainActivity extends Activity { TextView tv; Button appendBtn; Button clearBtn; OnClickListener btnClick; String myString = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView)findViewById(R.id.mytext); appendBtn = (Button)findViewById(R.id.append); clearBtn = (Button)findViewById(R.id.clear); tv.setText("android"); class myOnClickListener implements OnClickListener{ myOnClickListener(){ } @Override public void onClick(View v) { // TODO Auto-generated method stub try{ String url = "http://www.baidu.com"; URL myURL = new URL(url); URLConnection ucon = myURL.openConnection(); InputStream is = ucon.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); ByteArrayBuffer baf = new ByteArrayBuffer(50); int current = 0; while((current=bis.read())!=-1){ baf.append((byte)current); } myString = EncodingUtils.getString(baf.toByteArray(), "UTF-8"); }catch(Exception e){ myString = "error"; } //myEdit.append(myString); tv.append(myString); } } btnClick = new OnClickListener(){ public void onClick(View v){ //myEdit.getText().clear(); tv.setText(""); } }; appendBtn.setOnClickListener(new myOnClickListener()); clearBtn.setOnClickListener(btnClick); } }
当然,还需要在AndroidManifest.xml中添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
相应的,我们的layout文件要这样写:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:id="@+id/append" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/append"></Button> <Button android:id="@+id/clear" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/clear"></Button> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/mytext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/append" ></TextView> </LinearLayout> </LinearLayout>
运行程序,无论是真机(小米2S,Android4.1.1)还是模拟器(2.2和4.1分别测试),都应该能看到一坨html了。
接下来就是:搭建本地tomcat服务器,把web应用部署到tomcat,并让apk程序与之通信、交互。
其实web程序这边可以写的非常简单:只有一个index.html或者只有一个txt文档。假设我的工程名字叫chuandan,里边包括index.jsp和poem.txt两个文件,我进行了一些测试,结果如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 |
一、电脑和手机都连接到同一路由器 1.电脑和手机都连接到路由器(路由器能连接外网) 10.0.2.2:8080/chuandan/ 模拟器(2.2和4.1)、真机都error 2.电脑和手机都连接到路由器(路由器能连接外网) 模拟器(2.2和4.1)可以访问,真机error 3.电脑和手机都连接到路由器(路由器能连接外网) 模拟器(2.2和4.1)、真机,都能够接收到返回的数据 4.电脑和手机都连接到路由器(路由器能连接外网) http://192.168.1.101:8080/chuandan/ (192.168.1.101是电脑的局域网ip) 模拟器(2.2和4.1)都能接收到数据 真机的浏览器能访问,真机apk也可以访问(需要防火墙开启8080端口) 二、电脑不连路由器 两个模拟器都可以访问 手机无论浏览器还是apk都无法访问 三、电脑搭建局域网(wifi),手机连接到这个局域网 比如我的Fedora的ip是10.42.0.1,那么url就是这个地址: 手机apk可以接收到数据 |
也就是说,android应用程序这里的ip应当和电脑的局域网ip一致,手机和电脑(其实是tomcat服务器)要保持在同一局域网内。当然,如果仅仅是用模拟器测试,用http://10.0.2.2:8080/chuandan/index.html的形式也是OK的,但是真机上就不行了。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。