最近的Android项目开发过程中一个问题困扰自己很长时间,Android客户端与服务器交互有几种方式,最常见的就是webservices和json。要在Android手机客户端与pc服务器交互,需要满足下面几种条件:跨平台、传输数据格式标准、交互方便。

为了与服务器通讯其实无非就两种协议HTTP和TCP,TCP的学习Socket,HTTP的话熟悉一下HTTP协议和相关Java API。而下面的几种方式就是从这两种协议扩展出来的:webservices soap、SSH的JSON(可参考:该链接)、xmlrpc(wordpress for android)......

Socket 不推荐 ,HTTP RESTful 推荐。跟服务器传数据的话,一般都是采用 RESTful API 来传输。这样首先要对 HTTP 协议有初步的理解,至少知道 GET / POST 分别是干嘛的有什么区别。

如果没有特殊要求,使用webservices传输XML文件比较简单及通用,如果对数据大小及传输速度有要求的话就用json更合适。

【Socket与HTTP连接的区别】

HTTP连接使用的是“请求―响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。

socket是可以监听,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。保持客户端与服务器数据的实时与同步。

xml rpc是使用http协议做为传输协议的rpc机制,使用xml文本的方式传输命令和数据。

RPC是Remote Procedure Call的缩写,翻译成中文就是远程过程调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算”

网上有很多例子来演示Android客户端和服务器端数据如何实现交互。不过这些例子大多比较繁杂,对于初学者来说这是不利的,现在介绍一种代码简单、逻辑清晰的交互例子:

 使用webservices传输XML文件:

一、服务器端:

代码1:添加名为“AndroidServerServlet.java”的文件

package com.ghj.packageofservlet; import java.io.IOException;import java.io.PrintWriter; import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse; public class AndroidServerServlet extends HttpServlet {  private static final long serialVersionUID = 6792396567928634227L;  public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {  response.setContentType(text/plain; charset=UTF-8);  request.setCharacterEncoding(UTF-8);  System.err.println(request.getParameter(clientData));  PrintWriter printWriter = response.getWriter();  printWriter.print(您好Android客户端!);  printWriter.flush();  printWriter.close(); }}

代码2:修改名为“web.xml”的文件

  AndroidServerServlet  com.ghj.packageofservlet.AndroidServerServlet     AndroidServerServlet  /AndroidServerServlet 

二、Android手机客户端:

代码1:添加名为“AndroidClientActivity.java”的文件

package com.example.androidclient; import java.io.IOException;import java.io.UnsupportedEncodingException;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.HttpClient;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;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast; public class AndroidClientActivity extends Activity {   @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.android_client);   Button sendButton = (Button) findViewById(R.id.send_button);  sendButton.setOnClickListener(new OnClickListener(){   @Override   public void onClick(View v) {    new Thread(new Runnable(){     @Override     public void run() {      HttpPost httpRequest = new HttpPost(http://172.16.99.207:8080/AndroidServer/AndroidServerServlet);      List params = new ArrayList();      params.add(new BasicNameValuePair(clientData, 您好服务器端!));      try {       Message message = new Message();       Bundle bundle = new Bundle();       httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));//设置请求参数项       HttpClient httpClient = new DefaultHttpClient();       HttpResponse httpResponse = httpClient.execute(httpRequest);//执行请求返回响应       if(httpResponse.getStatusLine().getStatusCode() == 200){//判断是否请求成功        bundle.putString(msg, EntityUtils.toString(httpResponse.getEntity()));       }else{        bundle.putString(msg, 没有获取到Android服务器端的响应!);       }       message.setData(bundle);       handler.sendMessage(message);      } catch (ClientProtocolException e) {       e.printStackTrace();      } catch (UnsupportedEncodingException e) {       e.printStackTrace();      } catch (IOException e) {       e.printStackTrace();      }     }    }).start();   }  }); }   private Handler handler = new Handler(){  @Override  public void handleMessage(Message message) {   super.handleMessage(message);   Bundle bundle = message.getData();   String msg = bundle.getString(msg);   Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();  } };}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多相关文章

  1. Android中的数据持久化技术
  2. Hello Android - SQLite数据库操作
  3. okhttp的应用详解与源码解析--okhttp客户端应用
  4. 将服务器端字符读取至android的文本控件,换行符变成了黑方块的原
  5. Android数据加密之Base64编码算法
  6. 从头学Android之Android的数据存储--File
  7. 在 Android 上使用 XML 传输数据(附例子程序)

随机推荐

  1. Android 说说亮屏锁和键盘锁
  2. android 7.0系统解决拍照的问题android.o
  3. Android 关于动画设置问题。
  4. Android 复制和粘贴功能
  5. Android之ProGuard混淆器
  6. Android中的颜色设置
  7. android屏幕单位
  8. android framework集成第三方jar包
  9. android 实现APK之间的跳转
  10. 在使用ListFragment的setEmptyText时报ja