• Android客户端与服务器交互方式-小结


           最近的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”的文件

     1 package com.ghj.packageofservlet;
     2  
     3 import java.io.IOException;
     4 import java.io.PrintWriter;
     5  
     6 import javax.servlet.ServletException;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10  
    11 public class AndroidServerServlet extends HttpServlet {
    12  
    13     private static final long serialVersionUID = 6792396567928634227L;
    14  
    15     public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
    16         response.setContentType(text/plain; charset=UTF-8);
    17         request.setCharacterEncoding(UTF-8);
    18         System.err.println(request.getParameter(clientData));
    19         PrintWriter printWriter = response.getWriter();
    20         printWriter.print(您好Android客户端!);
    21         printWriter.flush();
    22         printWriter.close();
    23     }
    24 }

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

     1 <!--?xml version=1.0 encoding=UTF-8?-->
     2 <web-app http:="java.sun.com=" javaee="ns=" version="2.5" web-app_2_5.xsd="xml=" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/javaee"><servlet>
     3         <servlet-name>AndroidServerServlet</servlet-name>
     4         <servlet-class>com.ghj.packageofservlet.AndroidServerServlet</servlet-class>
     5     </servlet>
     6  
     7     <servlet-mapping>
     8         <servlet-name>AndroidServerServlet</servlet-name>
     9         <url-pattern>/AndroidServerServlet</url-pattern>
    10     </servlet-mapping>
    11 </web-app>

    二、Android手机客户端:

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

     1 package com.example.androidclient;
     2  
     3 import java.io.IOException;
     4 import java.io.UnsupportedEncodingException;
     5 import java.util.ArrayList;
     6 import java.util.List;
     7  
     8 import org.apache.http.HttpResponse;
     9 import org.apache.http.NameValuePair;
    10 import org.apache.http.client.ClientProtocolException;
    11 import org.apache.http.client.HttpClient;
    12 import org.apache.http.client.entity.UrlEncodedFormEntity;
    13 import org.apache.http.client.methods.HttpPost;
    14 import org.apache.http.impl.client.DefaultHttpClient;
    15 import org.apache.http.message.BasicNameValuePair;
    16 import org.apache.http.protocol.HTTP;
    17 import org.apache.http.util.EntityUtils;
    18  
    19 import android.app.Activity;
    20 import android.os.Bundle;
    21 import android.os.Handler;
    22 import android.os.Message;
    23 import android.view.View;
    24 import android.view.View.OnClickListener;
    25 import android.widget.Button;
    26 import android.widget.Toast;
    27  
    28 public class AndroidClientActivity extends Activity {
    29      
    30     @Override
    31     protected void onCreate(Bundle savedInstanceState) {
    32         super.onCreate(savedInstanceState);
    33         setContentView(R.layout.android_client);
    34  
    35         Button sendButton = (Button) findViewById(R.id.send_button);
    36         sendButton.setOnClickListener(new OnClickListener(){
    37             @Override
    38             public void onClick(View v) {
    39                 new Thread(new Runnable(){
    40                     @Override
    41                     public void run() {
    42                         HttpPost httpRequest = new HttpPost(http://172.16.99.207:8080/AndroidServer/AndroidServerServlet);
    43                         List<namevaluepair> params = new ArrayList<namevaluepair>();
    44                         params.add(new BasicNameValuePair(clientData, 您好服务器端!));
    45                         try {
    46                             Message message = new Message();
    47                             Bundle bundle = new Bundle();
    48                             httpRequest.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));//设置请求参数项
    49                             HttpClient httpClient = new DefaultHttpClient();
    50                             HttpResponse httpResponse = httpClient.execute(httpRequest);//执行请求返回响应
    51                             if(httpResponse.getStatusLine().getStatusCode() == 200){//判断是否请求成功
    52                                 bundle.putString(msg, EntityUtils.toString(httpResponse.getEntity()));
    53                             }else{
    54                                 bundle.putString(msg, 没有获取到Android服务器端的响应!);
    55                             }
    56                             message.setData(bundle);
    57                             handler.sendMessage(message);
    58                         } catch (ClientProtocolException e) {
    59                             e.printStackTrace();
    60                         } catch (UnsupportedEncodingException e) {
    61                             e.printStackTrace();
    62                         } catch (IOException e) {
    63                             e.printStackTrace();
    64                         }
    65                     }
    66                 }).start();
    67             }
    68         });
    69     }
    70      
    71     private Handler handler = new Handler(){
    72         @Override
    73         public void handleMessage(Message message) {
    74             super.handleMessage(message);
    75             Bundle bundle = message.getData();
    76             String msg = bundle.getString(msg);
    77             Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
    78         }
    79     };
    80 }</namevaluepair></namevaluepair>

    参考出处:1.http://blog.csdn.net/panfb227

                      2.http://www.2cto.com/kf/201501/370468.html

  • 相关阅读:
    给<label>点击事件时, 竟然点击了两次
    使用label失效的原因
    vue的又开启
    git使用切换分支等
    【转】 IOS,objective_C中用@interface和 @property 方式声明变量的区别
    【转】iOS-Core-Animation-Advanced-Techniques(六)
    【转】iOS-Core-Animation-Advanced-Techniques(五)
    【转】iOS-Core-Animation-Advanced-Techniques(四)
    【转】iOS-Core-Animation-Advanced-Techniques(三)
    【转】iOS-Core-Animation-Advanced-Techniques(二)
  • 原文地址:https://www.cnblogs.com/X-knight/p/5406362.html
Copyright © 2020-2023  润新知