wcf完美搭建android平台服务之三

     本章我们来实现对上一篇文章中配置的wcf服务,实现android客户端的应用,自己的android平台开发的水平有限,呵呵.代码都是小菜级别,但不妨碍功能的实现,开始之前我们做好准备工作,当然开发android程序,我们需要搭建好该开发平台,不废话,直接上步骤:

第一步:我这里新建了一个android2.2版本的AVD..运行软件同样适用Eclispe;

第二步:新建android解决方案,这几记住在选择平台的时候就要选择我们刚才的2.2版本...因为我们在此项目中需要用json的解析,虽然在android平台下已经为我们提供了json的解析包,但是需要在android3.0以上版本我们才能适用,对此我们需要自己构建json数据的解析包,还好Google已经为我们写好了一个比较优秀开源的json数据解析包,在这个网站查看下载:点击查看,下载此包:gson-1.6.jar,将包导入到工程项目中:

第四步,我们新建学生实体类:

package com.wxl.wcftest;

/**
* 学生实体类
* @author
*
*/
public class Sutdent
{
/**
* 姓名
*/
private String name;
/**
* 生日
*/
private String dayOfbirth;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getDayOfbirth()
{
return dayOfbirth;
}
public void setDayOfbirth(String dayOfbirth)
{
this.dayOfbirth = dayOfbirth;
}
@Override
public String toString()
{
return "Sutdent [name=" + name + ", dayOfbirth=" + dayOfbirth + "]";
}

}

第五步:我们新建一个用户连接服务的管理类,里面用两种方法(POST/GET)进行服务的连接,代码解释很到位不废话

package com.wxl.wcftest;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import android.util.Log;

public class HttpGetAndPost
{
// 定义变量
private HttpParams httpParams;
private HttpClient httpClient;

private String baseUrl="";

public HttpGetAndPost(String _url,String _extent)
{
baseUrl=_url;
baseUrl+=File.separatorChar+_extent;

Log.i("mylog", baseUrl);
}

/**
* Get获取
*
* @param baseUrl
* 域名
* @param params
* 参数集合
* @return
* 返回的字符串
*/
public String doGet(Map params)
{
/* 建立HTTPGet对象 */
String paramStr = "";
Iterator iter = params.entrySet().iterator();
while (iter.hasNext())
{
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
paramStr += paramStr =File.separatorChar + key.toString() + File.separatorChar + val.toString();
Log.i("mylog1111111111", paramStr);
}
if (!paramStr.equals(""))
{
baseUrl += paramStr;

Log.i("mylog", baseUrl);
}
HttpGet httpRequest = new HttpGet(baseUrl);
String strResult = "doGetError";
try
{
/* 发送请求并等待响应 */
HttpResponse httpResponse = httpClient.execute(httpRequest);
/* 若状态码为200 ok */
if (httpResponse.getStatusLine().getStatusCode() == 200)
{
/* 读返回数据 */
strResult = EntityUtils.toString(httpResponse.getEntity());

}
else
{
strResult = "Error Response: " + httpResponse.getStatusLine().toString();
}
}
catch (ClientProtocolException e)
{
strResult = e.getMessage().toString();
e.printStackTrace();
}
catch (IOException e)
{
strResult = e.getMessage().toString();
e.printStackTrace();
}
catch (Exception e)
{
strResult = e.getMessage().toString();
e.printStackTrace();
}

Log.v("strResult", strResult);

return strResult;
}

/**
* Post方式访问页面
* @param baseUrl
* 地址
* @param params
* 参数
* @return
*/
public String doPost(List<NameValuePair> params)
{
/* 建立HTTPPost对象 */
HttpPost httpRequest = new HttpPost(baseUrl);
String strResult = "doPostError";
try
{
/* 添加请求参数到请求对象 */
httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
/* 发送请求并等待响应 */
HttpResponse httpResponse = httpClient.execute(httpRequest);
/* 若状态码为200 ok */
if (httpResponse.getStatusLine().getStatusCode() == 200)
{
/* 读返回数据 */
strResult = EntityUtils.toString(httpResponse.getEntity());

} else
{
strResult = "Error Response: " + httpResponse.getStatusLine().toString();
}
}
catch (ClientProtocolException e)
{
strResult = e.getMessage().toString();
e.printStackTrace();
}
catch (IOException e)
{
strResult = e.getMessage().toString();
e.printStackTrace();
}
catch (Exception e)
{
strResult = e.getMessage().toString();
e.printStackTrace();
}

Log.v("strResult", strResult);

return strResult;
}

public HttpClient getHttpClient()
{

// 创建 HttpParams 以用来设置 HTTP 参数(这一部分不是必需的)
this.httpParams = new BasicHttpParams();

// 设置连接超时和 Socket 超时,以及 Socket 缓存大小
HttpConnectionParams.setConnectionTimeout(httpParams, 20 * 1000);

HttpConnectionParams.setSoTimeout(httpParams, 20 * 1000);

HttpConnectionParams.setSocketBufferSize(httpParams, 8192);

// 设置重定向,缺省为 true

HttpClientParams.setRedirecting(httpParams, true);

// 设置 user agent

String userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2) Gecko/20100115 Firefox/3.6";
HttpProtocolParams.setUserAgent(httpParams, userAgent);

// 创建一个 HttpClient 实例

// 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient

// 中的用法,在 Android 1.5 中我们需要使用 Apache 的缺省实现 DefaultHttpClient

httpClient = new DefaultHttpClient(httpParams);

return httpClient;
}

}

第六步、我们写一个方法用户json数据的解析:

package com.wxl.wcftest;
import java.io.StringReader;

import android.util.Log;
import com.google.gson.stream.JsonReader;

public class JsonManger
{

public Sutdent parse(String jsonData)
{
Sutdent json=new Sutdent();

//新建jsonRead对象
JsonReader jsonReader=new JsonReader(new StringReader(jsonData));
try
{

while(jsonReader.hasNext())
{
//开始读数据
jsonReader.beginObject();

while(jsonReader.hasNext())
{
String tageName=jsonReader.nextName();

if(tageName.equals("Name"))
{
json.setName(jsonReader.nextString());
}
else if(tageName.equals("DayOfbirth"))
{
json.setDayOfbirth(jsonReader.nextString());
}

}
}
jsonReader.endObject();

}
catch (Exception e)
{
Log.i("tageName", e.toString());
e.printStackTrace();
}
return json;
}
}

第七步、我们view就建立一个页面来显示数据,呵呵..很简单,晒下代码:

<?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"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="WCF服务提供数据解析"
/>
<TextView
android:id="@+id/myMessage"
android:layout_width="fill_parent"
android:layout_height="wrap_content"

/>
</LinearLayout>

第八步、我们调用此服务并作解析,将解析后的数据显示到页面中的textView中:

package com.wxl.wcftest;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class AndroidwcfActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView myTextView=(TextView)findViewById(R.id.myMessage);

//新建http对象
HttpGetAndPost myhttAndPost=new HttpGetAndPost("http://192.168.1.119:4600"+File.separatorChar +"json","Sutdent");

//定义参数
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("周润发", "1980-2-14"));

//定义参数
Map params2 = new HashMap();
params2.put("周润发", "1980-2-14");

myhttAndPost.getHttpClient();
String jsonStr=myhttAndPost.doGet(params2);

//新建json管理
JsonManger parseJson = new JsonManger();
Sutdent json = parseJson.parse(jsonStr);
myTextView.setText("名字:"+json.getName()+" 年龄:"+json.getDayOfbirth());
}
}

说明几点,为了保持服务的公用性,我将此服务发布到为了我们的服务其上,地址就是上面的192.168.1.119:4600了;

既然访问网络在android里面需要我们专门的配置权限,在AndroidManifest.xml文件中加入权限:

 <uses-permission android:name="android.permission.INTERNET" />

好了,到此我们已经完成客户端的建立,我们运行下看看,是否能成功访问我们自己建立的wcf服务:

嘿嘿...成功了,至此我们已经完成了wcf数据的服务的搭建工作,当然这只是简单的文本数据信息交换,为了完成文件的

上传和下载,不免的我们要使用流传输...下一篇中我们尝试用sream和wcf服务端进行交互,来实现文件的上传和下载。

源码点此下载

posted @ 2011-12-02 14:02  指尖流淌  阅读(4686)  评论(3编辑  收藏  举报