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服务端进行交互,来实现文件的上传和下载。

源码点此下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值