android与服务器交互
‘壹’ android与服务器交互用post好还是get
要根据实际应用的需求和数据量。
HTTP 定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST。
事实上 GET 适用于多数请求,而保留 POST 仅用于更新站点。根据 HTTP 规范,GET 用于信息获取,而且应该是 安全的和 幂等的。所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。幂等的意味着对同一 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。从根本上讲,其目标是当用户打开一个链接时,它可以确信从自身的角度来看没有改变资源。比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。
POST 请求就不那么轻松了。POST 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现,因为在注解提交之后站点已经不同了(比方说文章下面出现一条注解);
在FORM提交的时候,如果不指定Method,则默认为GET请求,Form中提交的数据将会附加在url之后,以?分开与url分开。字母数字字符原样发送,但空格转换为“+“号,其它符号转换为%XX,其中XX为该符号以16进制表示的ASCII(或ISO Latin-1)值。GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中;
GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
‘贰’ android客户端怎么与服务器交互
1、java服务器建立至少一种服务webservices、servlet、socket
2、客户端通过socket或者httpurlconnection的方式进行连接访问
服务端:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
resp.setContentType("text/html;charset=utf-8");
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
//用HTML格式给浏览器返回数据
out.println("<html>");
out.println("<head>");
out.println("<title>Tomcat Servlet测试</title>");
out.println("</head>");
out.println("<body>");
out.println("Hello,First Servlet!");
out.println("</body>");
out.println("</html>");
out.println("Hello,第一个Tomcat!!!");
out.close();
}
客户端:
private String doGet(String url){
String responseStr = "";
try {
String name = nameEdit.getText().toString().trim();
String code = codeEdit.getText().toString().trim();
String getUrl = URL + "?NAME=" + name+"&"+"CODE=" + code;
HttpGet httpRequest = new HttpGet(getUrl);
HttpParams params = new BasicHttpParams();
ConnManagerParams.setTimeout(params, 1000);
HttpConnectionParams.setConnectionTimeout(params, 3000);
HttpConnectionParams.setSoTimeout(params, 5000);
httpRequest.setParams(params);
HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);
final int ret = httpResponse.getStatusLine().getStatusCode();
if(ret == HttpStatus.SC_OK){
responseStr = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8);
}else{
responseStr = "-1";
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return responseStr;
}
‘叁’ 安卓手机客户端可以通过哪些方式与PC服务器端通信
有如下的方法供选择:
1. 利用USB口和USB连接线:
电脑可以将手机客户端作为一个终端访问,此时需要一款第三方软件,比如金山手机、豌豆荚、360等等。
也可以将手机作为一个外部存储器直接访问手机的存储位置来传递文件。
2.利用手机和电脑的蓝牙,采用蓝牙进行通讯。蓝牙通讯的距离一般小于10米。蓝牙建立连接之后,一般蓝牙的协议之中带有终端访问功能,可以直接传输文件。
3.利用wifi,两者都连接本地或公共wifi【手机通常有wifi,如果电脑没有无线,用有线连接网络也可以】:
通过共享文件夹的方式,互相访问传输文件。
也可以安装第三方FTP服务端和客户端软件,实现FTP文件传输。
或者利用邮箱,自己发给自己,自己在另一个设备上接收下载完成文件传输。
4.还有一种方法,就是两者都安装微信,同时开通他们,在微信中传输文件,另一台机器上将文件下载下来就可以了。
可能还有其他方法,取决于你对这些机器的理解程度。因为他们实际上都是网络上的一个节点。
‘肆’ android平台的app 手机客户端和后台服务器怎么进行数据交互的
首先不要管安卓端还是苹果端,现在一般都是响应式的app,你放到安卓或者苹果或者pc或者平板都是没有问题的。一般采用的是http接口通讯,或者socket连接。具体你要去查资料找Demo了。而且现在主流是采用html5开发或者混合开发了。所以最好是服务器提供appAPI接口,通过http访问服务器,获取数据,数据一般是json,或者xml,拿到后解析数据就可以了,然后再用UI框架或者其他框架或者自定义的UI封装下格式很漂亮了,至于cookie和session等,看你的习惯,网络验证和签名那些也自己看习惯,如果涉及到大数据,还需要引入第三方框架的,直接引入就可以了,不过推荐自己写,防止侵权。都是很通用的。
‘伍’ android与服务器交互的应用怎么设计
笔者以前是学的Java EE,由于项目需要要开发Android,所以临时补了一个多星期,主要是手机端和服务器端交互,双向开发的。 转载
首先在服务器端,我采用的是SSH框架,struts 2集合了JSON插件,服务器和客户端的信息交互采用的JSON来传输,由于在服务器端用了Struts 2,所以我就用装了一个JSON插件。这样,很轻易的就把服务器端的信息用JSON的形式发送到了手机端。以下是代码:
首先,在服务器端搭建好SSH框架,具体细节就不在陈述。struts.xml配置如下:
<packagename="login"extends="json-default">
<actionname="login"class="com.jclick.test.LoginAction"method="login">
<resulttype="json"><paramname="includeProperties">result</param></result>
</action>
</package>
<packagename="login"extends="json-default">
<actionname="login"class="com.jclick.test.LoginAction"method="login">
<resulttype="json"><paramname="includeProperties">result</param></result>
</action>
</package>
手机端的代码如下:
首先,手机端有一个缓存类,主要用于缓存一些手机端需要访问的数据,这样的好处是可以达达节省手机和服务器的交互,用单例实现的:
packagecom.jclick.cache;
importcom.jclick.bean.User;
publicclassCache{
privateUserUser;
privateCache(){
}
/**构造单例*/
privatestaticclassCacheHolder{
=newCache();
}
publicCachegetInstance(){
returnCacheHolder.INSTANCE;
}
publicUsergetUser(){
returnUser;
}
publicvoidsetUser(UserUser){
this.User=User;
}
}
packagecom.jclick.cache;
importcom.jclick.bean.User;
publicclassCache{
privateUserUser;
privateCache(){
}
/**构造单例*/
privatestaticclassCacheHolder{
=newCache();
}
publicCachegetInstance(){
returnCacheHolder.INSTANCE;
}
publicUsergetUser(){
returnUser;
}
publicvoidsetUser(UserUser){
this.User=User;
}
}
接着开始书写手机端的协议,用户向服务器发送请求,同时服务器反馈给手机端信息的:
packagecom.jclick.protocol;
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.util.ArrayList;
importjava.util.List;
importorg.apache.http.HttpResponse;
importorg.apache.http.NameValuePair;
importorg.apache.http.client.HttpClient;
importorg.apache.http.client.entity.UrlEncodedFormEntity;
importorg.apache.http.client.methods.HttpPost;
importorg.apache.http.impl.client.DefaultHttpClient;
importorg.apache.http.message.BasicNameValuePair;
importorg.json.JSONException;
importorg.json.JSONObject;
publicclassBaseProtocol{
privateStringBuildersb=newStringBuilder();
privateHttpClienthttpClient;
privateHttpPosthttpRequest;
privateHttpResponseresponse;
privateList<NameValuePair>nameValuePair=newArrayList<NameValuePair>();
BaseProtocol(){
httpClient=newDefaultHttpClient();
}
/**
*向服务器端发送请求
*
*@paramurl
*@throwsException
*/
protectedvoidpack(Stringurl)throwsException{
httpClient=newDefaultHttpClient();
httpRequest=newHttpPost(url);
httpRequest.setEntity(newUrlEncodedFormEntity(nameValuePair));
response=httpClient.execute(httpRequest);
}
/**
*得到返回数据
*
*@paramurl
*@return
*@throwsException
*/
protectedvoidparse()throwsException{
//TODO状态处理500200
if(response.getStatusLine().getStatusCode()==200){
BufferedReaderbufferedReader2=newBufferedReader(
newInputStreamReader(response.getEntity().getContent()));
for(Strings=bufferedReader2.readLine();s!=null;s=bufferedReader2
.readLine()){
sb.append(s);
}
}
}
/**
*向服务器发送信息
*
*@paramkey
*@paramvalue
*/
publicvoidaddNameValuePair(Stringkey,Stringvalue){
nameValuePair.add(newBasicNameValuePair(key,value));
}
/**
*返回JSONObject对象数据模型
*
*@return
*@throwsJSONException
*/
publicJSONObjectgetJSON()throwsJSONException{
returnnewJSONObject(sb.toString());
}
}
packagecom.jclick.protocol;
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.util.ArrayList;
importjava.util.List;
importorg.apache.http.HttpResponse;
importorg.apache.http.NameValuePair;
importorg.apache.http.client.HttpClient;
importorg.apache.http.client.entity.UrlEncodedFormEntity;
importorg.apache.http.client.methods.HttpPost;
importorg.apache.http.impl.client.DefaultHttpClient;
importorg.apache.http.message.BasicNameValuePair;
importorg.json.JSONException;
importorg.json.JSONObject;
publicclassBaseProtocol{
privateStringBuildersb=newStringBuilder();
privateHttpClienthttpClient;
privateHttpPosthttpRequest;
privateHttpResponseresponse;
privateList<NameValuePair>nameValuePair=newArrayList<NameValuePair>();
BaseProtocol(){
httpClient=newDefaultHttpClient();
}
/**
*向服务器端发送请求
*
*@paramurl
*@throwsException
*/
protectedvoidpack(Stringurl)throwsException{
httpClient=newDefaultHttpClient();
httpRequest=newHttpPost(url);
httpRequest.setEntity(newUrlEncodedFormEntity(nameValuePair));
response=httpClient.execute(httpRequest);
}
/**
*得到返回数据
*
*@paramurl
*@return
*@throwsException
*/
protectedvoidparse()throwsException{
//TODO状态处理500200
if(response.getStatusLine().getStatusCode()==200){
BufferedReaderbufferedReader2=newBufferedReader(
newInputStreamReader(response.getEntity().getContent()));
for(Strings=bufferedReader2.readLine();s!=null;s=bufferedReader2
.readLine()){
sb.append(s);
}
}
}
/**
*向服务器发送信息
*
*@paramkey
*@paramvalue
*/
publicvoidaddNameValuePair(Stringkey,Stringvalue){
nameValuePair.add(newBasicNameValuePair(key,value));
}
/**
*返回JSONObject对象数据模型
*
*@return
*@throwsJSONException
*/
publicJSONObjectgetJSON()throwsJSONException{
returnnewJSONObject(sb.toString());
}
}
接着是登陆协议,在这里我只是模拟登陆使用的一个类,仅供大家参考:
packagecom.jclick.protocol;
importorg.json.JSONObject;
importcom.jclick.bean.User;
{
privatefinalstaticStringURL="http://localhost:8080/test/login";
publicbooleancheckLogin(Userusr){
try{
pack(URL);
parse();
JSONObjectobj=this.getJSON();
if(obj.getString("result").equals("failed")){
returnfalse;
}else{
returntrue;
}
}catch(Exceptione){
e.printStackTrace();
returnfalse;
}
}
}
packagecom.jclick.protocol;
importorg.json.JSONObject;
importcom.jclick.bean.User;
{
privatefinalstaticStringURL="http://localhost:8080/test/login";
publicbooleancheckLogin(Userusr){
try{
pack(URL);
parse();
JSONObjectobj=this.getJSON();
if(obj.getString("result").equals("failed")){
returnfalse;
}else{
returntrue;
}
}catch(Exceptione){
e.printStackTrace();
returnfalse;
}
}
}
然后是User实体类,主要用于保存用户信息:
packagecom.jclick.bean;
publicclassUser{
privateStringusername;
privateStringpassword;
publicStringgetUsername(){
returnusername;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
}
packagecom.jclick.bean;
publicclassUser{
privateStringusername;
privateStringpassword;
publicStringgetUsername(){
returnusername;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
}
最后就是LoginActivity里边判断登陆的代码了,详细代码不再贴出来了,仅贴一个判断登陆的代码:
privatevoidcheckedData(){
username=((EditText)findViewById(R.id.username)).getText().toString();
password=((EditText)findViewById(R.id.password)).getText().toString();
Useruser=newUser();
user.setUsername(username);
user.setPassword(password);
LoginProtocollogin=newLoginProtocol();
booleanresult=login.checkLogin(user);
if(result){SpiderCache.getInstance().setUserSession(user);
Toast.makeText(getApplicationContext(),"登录成功",1000).show();
Intentintent=newIntent();
intent.setClass(LoginActivity.this,WelcomeActivity.class);
startActivity(intent);
}else{Toast.makeText(LoginActivity.this,"密码或用户名不匹配,请重新输入!",1000).show();
}
}
privatevoidcheckedData(){
username=((EditText)findViewById(R.id.username)).getText().toString();
password=((EditText)findViewById(R.id.password)).getText().toString();
Useruser=newUser();
user.setUsername(username);
user.setPassword(password);
LoginProtocollogin=newLoginProtocol();
booleanresult=login.checkLogin(user);
if(result){ SpiderCache.getInstance().setUserSession(user);
Toast.makeText(getApplicationContext(),"登录成功",1000).show();
Intentintent=newIntent();
intent.setClass(LoginActivity.this,WelcomeActivity.class);
startActivity(intent);
}else{ Toast.makeText(LoginActivity.this,"密码或用户名不匹配,请重新输入!",1000).show();
}
}
以上代码为了跟大家分享一下,感觉手机端和服务器双向开发非常过瘾。同时对Android的兴趣大大提升,它也没有我们想象中的那么难。
‘陆’ Android客户端怎么与服务器数据库连接
不能与数据库连接的
Android客户端不能直接与服务器数据库连接。数据库是需要非常大的内存,安装之后有好几G,连接数据库要有一个像SQLServer里的webservice,这样的一个桥梁来间接访问。就是在服务器运行一个服务端程序,该服务端程序通过接收来自android客户端的指令,对数据库进行操作。
客户端的http请求可以通过 HttpClient类实现,在anddroid 4.0之后,客户端的网络请求已经不被允许在主线程中运行,所以还需注意另开启一个子线程进行网络请求。
(6)android与服务器交互扩展阅读:
Android安全权限机制:
Android默认设置下,所有应用都没有权限对其他应用、系统或用户进行较大影响的操作。这其中包括读写用户隐私数据(联系人或电子邮件),读写其他应用文件,访问网络或阻止设备待机等。安装应用时,在检查程序签名提及的权限,且经过用户确认后,软件包安装器会给予应用权限。
下载一款Android应用通常会要求如下的权限:拨打电话、发送短信或彩信、修改/删除SD卡上的内容、读取联系人的信息、读取日程信的息,写入日程数据、读取电话状态或识别码、精确的(基于GPS)地理位置、模糊的(基于网络获取)地理位置、创建蓝牙连接、
还有对互联网的完全访问、查看网络状态,查看WiFi状态、避免手机待机、修改系统全局设置、读取同步设定、开机自启动、重启其他应用、终止运行中的应用、设定偏好应用、震动控制、拍摄图片等。
‘柒’ android客户端和服务器端怎么交互
1.本机数据库IP可以使用localhost,端口:3306 2.或者”打开网络和共享中心“查看属性,找到IP地址 3.或者,Windows+R,打开cmd命令,输入ipconfig,查看ipv4地址,即ip地址
‘捌’ android与WEB服务器交互时,如何保证在同一个会话Session中通信
最近在开发项目的过程中,遇到android与web服务器要在同一session下通信的问题。在解决问题前先回顾下Session与Cookie:Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力。Session可以用Cookie来实现,也可以用URL回写的机制来实现。Cookie和Session有以下明显的不同点:1)Cookie将状态保存在客户端,Session将状态保存在服务器端;2)Cookies是服务器在本地机器上存储的小段文本并随每一个请求发送至同一个服务器。网络服务器用HTTP头向客户端发送cookies,在客户终端,浏览器解析这些cookies并将它们保存为一个本地文件,它会自动将同一服务器的任何请求缚上这些cookies。3)Session是针对每一个用户的,变量的值保存在服务器上,用一个sessionID来区分是不同用户session变量,这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器;4)就安全性来说:当你访问一个使用session 的站点,同时在自己机器上建立一个cookie,建议在服务器端的SESSION机制更安全些.因为它不会任意读取客户存储的信息。Session机制Session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。Session的实现方式1) 使用Cookie来实现服务器给每个Session分配一个唯一的JSESSIONID,并通过Cookie发送给客户端。当客户端发起新的请求的时候,将在Cookie头中携带这个JSESSIONID。这样服务器能够找到这个客户端对应的Session。2 )使用URL回显来实现URL回写是指服务器在发送给浏览器页面的所有链接中都携带JSESSIONID的参数,这样客户端点击任何一个链接都会把JSESSIONID带给服务器。
如果直接在浏览器中输入url来请求资源,Session是匹配不到的。Tomcat对 Session的实现,是一开始同时使用Cookie和URL回写机制,如果发现客户端支持Cookie,就继续使用Cookie,停止使用URL回写。如果发现Cookie被禁用,就一直使用URL回写。jsp开发处理到Session的时候,对页面中的链接记得使用 response.encodeURL() 。回顾完Session和Cookie,我们来说说为什么手机端与服务器交互没有实现在同一session下?1)原因很简单,就是因为android手机端在访问web服务器时,没有给http请求头部设置sessionID,而使用web浏览器作为客户端访问服务器时,在客户端每次发起请求的时候,都会将交互中的sessionID:JSESSIONID设置在Cookie头中携带过去,服务器根据这个sessionID获取对应的Session,而不是重新创建一个新Session(除了这个Session失效)。以java.net.HttpURLConnection发起请求为例:获取Cookie: URL url = new URL(requrl);
HttpURLConnection con= (HttpURLConnection) url.openConnection();
// 取得sessionid.
String cookieval = con.getHeaderField("set-cookie");
String sessionid;
if(cookieval != null) {
sessionid = cookieval.substring(0, cookieval.indexOf(";"));
} //sessionid值格式:JSESSIONID=,是键值对,不是单指值发送设置cookie: URL url = new URL(requrl);
HttpURLConnectioncon= (HttpURLConnection) url.openConnection();