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的,但是真机上就不行了。

======
sample工程下载:
服务器端
客户端

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。