欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

详解Android客户端与服务器交互方式

程序员文章站 2024-02-21 17:04:52
最近的android项目开发过程中一个问题困扰自己很长时间,android客户端与服务器交互有几种方式,最常见的就是webservices和json。要在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”的文件

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

<!--?xml version=1.0 encoding=utf-8?-->
<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>
  <servlet-name>androidserverservlet</servlet-name>
  <servlet-class>com.ghj.packageofservlet.androidserverservlet</servlet-class>
 </servlet>
 
 <servlet-mapping>
  <servlet-name>androidserverservlet</servlet-name>
  <url-pattern>/androidserverservlet</url-pattern>
 </servlet-mapping>
</web-app>

二、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<namevaluepair> params = new arraylist<namevaluepair>();
      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();
  }
 };
}

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