详解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(); } }; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。