您的位置:首页 > 职场人生

.Net程序员玩转Android开发---(14)客户端与服务器进行通信

2014-12-22 17:47 465 查看
前几天看到有同学问, android客户端怎么和服务端进行数据通信,获取服务器端的数据,和服务器端进行交互,这一节我们来共同学习一下这方面的内容。首先要明白既然远程通信操作,就要有服务器端和客户端。服务器端创建服务,客户端调用服务。正如在.NET中,通常我们用WCF创建服务,客户端通过添加服务来调用.Android中,客户端通过向服务器端POST 数据,可以与服务器端进行交互。可以使用android中的HttpPost类来操作。下面我们具体演示下。这节我们服务器端采用WCF服务。1. 服务端首先我们创建WCF服务项目,我们创建resrful格式的WCF服务,这样方便接受客户端传来的数据,同时也方便调用。下面的代码中创建一个GetResponse接口,数据传输方式采用JSON格式进行传输,
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebInvoke(UriTemplate = "GetResponse", Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
TopResponse GetResponse(Stream stream);

// TODO: 在此添加您的服务操作
}

public class TopResponse
{
public string ErrorCode { get; set; }

public string ErrorMsg { get; set; }

}
public class Service1 : IService1
{
public TopResponse GetResponse(Stream stream)
{
TopResponse response = new TopResponse();

StreamReader sr = new StreamReader(stream);
string s = sr.ReadToEnd();
sr.Dispose();
NameValueCollection nvc = HttpUtility.ParseQueryString(s);

if (nvc["code"] == "10000")
{
response.ErrorCode = "10000";
response.ErrorMsg = "Success";
}
else
{
response.ErrorCode = "10010";
response.ErrorMsg = "Failure";
}

return response;
}
}
web.config
<?xml version="1.0" encoding="utf-8"?><configuration><system.web><compilation debug="true" targetFramework="4.0" /></system.web><system.serviceModel><services><service name="WcfServiceDemo.Service1"><endpoint binding="webHttpBinding" contract="WcfServiceDemo.IService1" behaviorConfiguration="webHttp"/></service></services><bindings><webHttpBinding><binding  sendTimeout="00:20:00"   maxReceivedMessageSize="2147483647" ><security mode="None" /></binding></webHttpBinding></bindings><behaviors><endpointBehaviors><behavior name="webHttp"><webHttp/></behavior></endpointBehaviors><serviceBehaviors><behavior><serviceMetadata httpGetEnabled="true"/><serviceDebug includeExceptionDetailInFaults="true"/></behavior></serviceBehaviors></behaviors><serviceHostingEnvironment multipleSiteBindingsEnabled="true" /></system.serviceModel><system.webServer><modules runAllManagedModulesForAllRequests="true"/><!--若要在调试过程中浏览 Web 应用程序根目录,请将下面的值设置为 True。在部署之前将该值设置为 False 可避免泄露 Web 应用程序文件夹信息。--><directoryBrowse enabled="true"/></system.webServer></configuration>
2.客户端客户端使用httppost向服务器端post 数据,有一点要注意的是,好像在android 3.0 以后,要单独起一个线程来与服务器进行通信。
package com.example.helloword;import java.io.IOException;import java.util.ArrayList;import java.util.List;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import org.apache.http.protocol.HTTP;import org.apache.http.util.EntityUtils;import android.app.Activity;import android.os.Bundle;public class AbsLayout extends Activity {private Thread thread;protected void onCreate(Bundle savedInstanceState){// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.abslayout);thread=new Thread(new Runnable(){@Overridepublic void run(){try{String url = "http://192.168.1.103/Service1.svc/GetResponse";//创建连接HttpPost httpPost = new HttpPost(url);//封装参数List<NameValuePair> params = new ArrayList<NameValuePair>();params.add(new BasicNameValuePair("code", "10000"));HttpResponse httpResponse = null;try {httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));httpResponse = new DefaultHttpClient().execute(httpPost);if (httpResponse.getStatusLine().getStatusCode() == 200) {String result = EntityUtils.toString(httpResponse.getEntity()); //获取返回结果System.out.println(result);}} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}catch(Exception e){e.printStackTrace();}}});thread.start();}}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: