android-数据存储之远程服务器存储
一、如何编码实现客户端与服务器端的交互
<一>JDK内置原生API
HttpUrlConnection
<二>Android内置的包装API
HttpClient浏览器
<三>异步网络请求框架
.Volley
.Xutils
二、声明权限
进行网络求情需要在AndroidManifest.xml文件中声明连接网络的权限:
三、访问网络必须在分线程中执行
..................
四、HTTP协议
1、一次请求过程:
建立连接——>发送请求——>处理请求——>返回数据——>.....——>关闭连接
2、HTTP请求常用方式:
<1>GET
请求参数地址栏可见
<2>POST
3、HTTP请求格式:
<request-line> ---请求行:用于描述客户端请求方式,包括请求资源名以及使用的HTTP协议版本号
<headers> ---请求头:用于描述客户端请求哪台主机,以及客户端一些环境信息
<blank line> ---一个空行
[<request-body>] ---请求体:实体内容
eg.
说明:第一行必须是一个请求行(request-line),用来说明请求类型,要访问的资源以及所使用的HTTP版本.
紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息.
之后是一个空行.
再后面可以添加任意的其他数据[称之为主体(body)].
GET请求:
GET / HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Host: www.google.cn
Connection: Keep-Alive
说明:请求的第一部分说明了该请求是一个GET请求.该行的第二部分是一个斜杠(/),用来说明请求的是该域名的根目录.该行的最后一部分说明使用的是HTTP1.1版本(另一个可选荐是1.0).
第2行是请求的第一个首部,HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送.Connection,通常将浏览器操作设置为Keep-Alive
第三部分,空行,即使不存在请求主体,这个空行也是必需的.
POST请求:
POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
说明:请求行开始处的GET改为POST,以表示不同的请求类型.
Content-Type说明了请求主体的内容是如何编码的.浏览器始终以application/x-www-form-urlencoded的格式编码来传送数据,这是针对简单URL编码的MIME类型.Content-Length说明了请求主体的字节数.
最后请求主体.名称-值对的形式.
4、HTTP响应格式
<status-line> ---响应行/状态行:描述服务器对请求的处理结果
<headers> ---消息头(可以多行):描述服务器基本信息以及对数据的描述,服务器通过这些数据的描述信息可以通知客户端如何处理服务器回送的数据。
<blank line> ---一个空行
[<response-body>] ---实体内容:代表服务器向向客户端回送的数据。
eg.
HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8
<html>
<head></head>
<body>
<!--body goes here-->
</body>
</html>
说明:HTTP状态码200,找到资源,并且一切正常;203:重定向;404:找不到资源。
Date:生成响应的日期和时间.
Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8
HTML源文体.
五、测试
1、搭建远程服务器:
a.安装并配置Tomcat
b.创建一个动态Web工程
c.把需要直接访问的资源放在WebContent/WebRoot目录下
d.可能需要创建Servlet/Filter
e.运行
f.访问:http://ip:8080/xxx/index.jsp
2、使用JDK内置原生API
1>HttpConnection
URL:包含请求地址的类:
---URL(path) 包含请求路径的构造方法
---openConnection() 得到连接对象,返回HttpConnection(本地连接)
测试:
URL url=new URL(path);
HttpConnection connection=url.openConnection();
2>HttpURLConnection 代表与服务器连接的类
setMethod("GET/POST") 设置请求发式
setConnectTimeOut(time) 设置连接超时时间
setReadTimeOut(time) 设置读取服务器返回数据的时间
connect() 连接服务器(服务器连接)
int getResponseCode() 得到服务器返回的结果码
int getContentLength() 得到服务器返回数据的长度
getOutputStream() 返回一个指向服务器端的数据输出流
getInputStream() 返回一个从服务器端返回的数据输入流
disconnect() 断开连接
3、Android内置的包装API
HttpClient
1>HttpClient(抽象类)/DefaultHttpClient 能提交请求的客户端对象
.HttpResponse execute(HttpUriRequest request) 执行包含请求数据的请求对象,返回包含响应数据的响应对象
.HttpParams getParams() 得到包含请求参数的对象
2>HttpConnectionParams 设置请求参数的工具类
.static setConnectionTimeout(params,time) 设置获取连接的超时时间
.static setSoTimeout(params,time) 设置读取数据的超时时间
3>HttpGet (Get请求)
HttpGet(String path) 包含请求路径的构造方法
4>HttpPost (Post请求)
HttpPost(String path) :包含请求路径的构造方法
setEntity(HttpEntity entity): 设置请求体
5>NameValuePair/BasicNameValuePair :包含参数键值对
BasicNameValuePair(String name,String value)
6>HttpResponse: 服务器返回的响应
getStatusLine() : 得到响应状态行从而得到状态吗
getEntity() :得到响应体数据对象
7>EntityUtils :解析HttpEntity的工具类
toString(httpEntity) :解析响应体得到内容字符串
8>关闭连接释放资源
getConnectionManager().show()
4、异步网络请求框架--volley
Android网络通信库,能使网络通信更快、更简单、更健壮;适合数据量不大但通信频繁的场景;
a.不需要我们启动分线程,框架内部接收到请求后自动会在分线程
b.如何返回数据? 切换到主线程调用监听器的回调方法。
1>RequestQueue:请求队列,会自动执行队列中的请求
.Volley.new RequestQueue(context) :创建一个请求队列
.addRequest(Request request) : 将请求添加到请求对队列
2>Request<T>: 代表请求的接口
StringRequest : 获取字符串结果请求
JsonRequest: 获取json字符串结果请求
ImageRequest: 获取图片结果请求
3>
六、知识拓展
1、ByteArrayOutputStream类
2、 runOnUiThread()方法
源码:
public class MainActivity extends Activity {
private TextView tv;
private RequestQueue queue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv=(TextView) findViewById(R.id.textView1);
queue=Volley.newRequestQueue(this);
}
public void testGet(View v) throws Exception{
final ProgressDialog dialog=ProgressDialog.show(this, null, "正在请求中...");
new Thread(){
public void run() {
String path="http://192.168.56.1:8080/Web_Server/index.jsp?name=tom&age=23";
URL url;
try {
url = new URL(path);
HttpURLConnection huc= (HttpURLConnection)url.openConnection();
huc.setRequestMethod("GET");
huc.setConnectTimeout(5000);
huc.setReadTimeout(6000);
huc.connect();
//发送请求
int responseCode=huc.getResponseCode();
if (responseCode==200) {
InputStream is=huc.getInputStream();
ByteArrayOutputStream baos=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int len=-1;
while((len=is.read(buffer))!=-1){
baos.write(buffer, 0, len);
}
final String reault=baos.toString();
baos.close();
is.close();
//在主线程更新ui
runOnUiThread(new Runnable() {
@Override
public void run() {
tv.setText(reault);
dialog.dismiss();
}
});
//断开连接
huc.disconnect();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
dialog.dismiss();
}
}
}.start();
}
public void testPost1(View v){
final ProgressDialog dialog=ProgressDialog.show(this, null, "正在请求中...");
new Thread(){
public void run() {
String path="http://192.168.56.1:8080/Web_Server/index.jsp";
URL url;
try {
url = new URL(path);
HttpURLConnection huc= (HttpURLConnection)url.openConnection();
huc.setRequestMethod("POST");
huc.setConnectTimeout(5000);
huc.setReadTimeout(6000);
huc.connect();
OutputStream os=huc.getOutputStream();
String data="name=tom5&age=11";
os.write(data.getBytes("utf-8"));
//发送请求
int responseCode=huc.getResponseCode();
if (responseCode==200) {
InputStream is=huc.getInputStream();
ByteArrayOutputStream baos=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int len=-1;
while((len=is.read(buffer))!=-1){
baos.write(buffer, 0, len);
}
final String reault=baos.toString();
baos.close();
is.close();
//在主线程更新ui
runOnUiThread(new Runnable() {
@Override
public void run() {
tv.setText(reault);
dialog.dismiss();
}
});
//断开连接
huc.disconnect();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
dialog.dismiss();
}
}
}.start();
}
public void testGet2(View v) throws Exception{
final ProgressDialog dialog=ProgressDialog.show(this, null, "正在请求中...");
new Thread(){
public void run() {
String path="http://192.168.56.1:8080/Web_Server/index.jsp?name=tom&age=23";
try {
//创建Client对象
HttpClient httpClient=new DefaultHttpClient();
//设置超时
HttpParams params=httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, 5000);
HttpConnectionParams.setSoTimeout(params, 5000);
//创建请求对象
HttpGet request=new HttpGet(path);
//执行请求对象
HttpResponse response=httpClient.execute(request);
int statusCode=response.getStatusLine().getStatusCode();
if (statusCode==200) {
//得到响应文本
HttpEntity entity=response.getEntity();
final String result=EntityUtils.toString(entity);
//在主线程更新ui
runOnUiThread(new Runnable() {
@Override
public void run() {
tv.setText(result);
dialog.dismiss();
}
});
}
//断开连接
httpClient.getConnectionManager().shutdown();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
dialog.dismiss();
}
}
}.start();
}
public void testPost2(View v){
final ProgressDialog dialog=ProgressDialog.show(this, null, "正在请求中...");
new Thread(){
public void run() {
String path="http://192.168.56.1:8080/Web_Server/index.jsp";
try {
//创建Client对象
HttpClient httpClient=new DefaultHttpClient();
//设置超时
HttpParams params=httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, 5000);
HttpConnectionParams.setSoTimeout(params, 5000);
//创建请求对象
HttpPost request=new HttpPost(path);
//设置请求体
List<BasicNameValuePair> parameters=new ArrayList<>();
parameters.add(new BasicNameValuePair("name", "tom4"));
parameters.add(new BasicNameValuePair("age", "14"));
HttpEntity entity=new UrlEncodedFormEntity(parameters);
request.setEntity(entity);
//执行请求对象
HttpResponse response=httpClient.execute(request);
int statusCode=response.getStatusLine().getStatusCode();
if (statusCode==200) {
//得到响应文本
HttpEntity entity2=response.getEntity();
final String result=EntityUtils.toString(entity2);
//在主线程更新ui
runOnUiThread(new Runnable() {
@Override
public void run() {
tv.setText(result);
dialog.dismiss();
}
});
}
//断开连接
httpClient.getConnectionManager().shutdown();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
dialog.dismiss();
}
}
}.start();
}
public void get4(View v){
final ProgressDialog dialog=ProgressDialog.show(this, null, "正在请求中...");
String path="http://192.168.56.1:8080/Web_Server/index.jsp?name=tom&age=23";
StringRequest request=new StringRequest(path, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
tv.setText(response);
dialog.dismiss();
}
}, null);
//将请求添加到队列中
queue.add(request);
}
public void post4(View v){
final ProgressDialog dialog=ProgressDialog.show(this, null, "正在请求中...");
String path="http://192.168.56.1:8080/Web_Server/index.jsp";
StringRequest request=new StringRequest(Method.POST,path,new Response.Listener<String>() {
@Override
public void onResponse(String response) {
tv.setText(response);
dialog.dismiss();
}
}, null){
//通过重写方法--请求体
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> map=new HashMap<>();
map.put("name", "tom678");
map.put("age", "78");
return map;
}
};
queue.add(request);
}
}
android-数据存储之远程服务器存储的更多相关文章
- SQLServer怎样把本地数据导入到远程服务器上(转载)
平常用到mssql时间比较少,总是过一段时间就忘记应该怎么操作了.当要做mssq把本地数据导入到远程服务器的时候,就去网上搜索很久都没有图解的,所以今天自己收集一下免得下次又到处去找.希望对自己,同时 ...
- Android课程---远程服务器存储
在使用Volley进行获取数据时,需要事先准备环境:在libs里面导入一个Volley.jar包,在网上都有,可以下载下来导入,或者自己电脑上有DT的,自己合成一个包也行. WebActivity.j ...
- Android开发学习——android数据存储
Android的存储 Android中的数据存储方式及其存储位置 SharedPrefrence存储 1). 位置 /data/data/packageName/shared_pr ...
- 远程块存储iSCSI
/* Border styles */ #table-2 thead, #table-2 tr { border-top-width: 1px; border-top-style: solid; bo ...
- Windows平台将远程服务器的目录挂载为本地磁盘
我们在设置数据库自动备份时,为了数据的安全往往需要直接将数据备份到远程服务器上.在Linux可以通过NFS挂载来实现,在Windows平台可以直接通过net use+subst来实现将远程服务器的目录 ...
- 【Android应用开发】 Android 崩溃日志 本地存储 与 远程保存
示例代码下载 : http://download.csdn.net/detail/han1202012/8638801; 一. 崩溃日志本地存储 1. 保存原理解析 崩溃信息本地保存步骤 : -- 1 ...
- Android数据存储方式--SharedPreferences
Android数据存储方式有如下四种:SharedPreferences.存储到文件.SQLite数据库.内容提供者(Content provider).存储到网络服务器. 本文主要介绍一下Share ...
- Android 数据存储五种方式
1.概述 Android提供了5种方式来让用户保存持久化应用程序数据.根据自己的需求来做选择,比如数据是否是应用程序私有的,是否能被其他程序访问,需要多少数据存储空间等,分别是: ① 使用Shared ...
- android开发中的5种存储数据方式
数据存储在开发中是使用最频繁的,根据不同的情况选择不同的存储数据方式对于提高开发效率很有帮助.下面笔者在主要介绍Android平台中实现数据存储的5种方式. 1.使用SharedPreferences ...
随机推荐
- 安卓app设计规范整理和Android APP设计篇(转)
随着安卓智能手机不停的更新换代.安卓手机系统越来越完美,屏幕尺寸也越来越大啦!比如最近小米的miui 6的发布和魅族手机系统的更新等等. 以小米MIUI6的安卓手机来说,MIUI6进行了全新设计,坚持 ...
- FastDFS实现文件上传下载实战
正好,淘淘商城讲这一块的时候,我又想起来当时老徐让我写过一个关于实现FastDFS实现文件上传下载的使用文档,当时结合我们的ITOO的视频系统和毕业论文系统,整理了一下,有根据网上查到的知识,总结了一 ...
- 【pom.xml 依赖】使用net.sf.json-lib-2.4-jdk15.jar所需要的其他依赖架包 以及其一直在pom.xml报错的问题
特此声明: json-lib-2.4-jdk15.jar仅它本身不够,必须如下的几个依赖架包都有才能使用!!! 首先 将.json-lib-2.4-jdk15.jar以及其相关的依赖架包的正确配置给出 ...
- thinkphp测试方法
1.如果是单个函数可以使用命令行的模式调试. 2.如果是公用函数可以新增一个控制器函数来测试: 如测试这条公共函数
- LoadRunner 12.02 安装以及汉化教程
LoadRunner 12.02 安装 一.下载 首先下载Loadrunner12安装包. 下载后有四个安装包: HP_LoadRunner_12.02_Community_Edition_Addit ...
- JAVA Day6
1.对象:用来描述客观事物的一个实体,由一组属性和方法组成 2.属性--对象具有的各种特征 *每个对象的每个属性都拥有特定值 *例如:张浩和李明的年龄.姓名不一样 3.方法--对象执行的操 ...
- JSON.parse()和JSON.stringify()使用
JSON.parse()用于从一个字符串中解析出json对象,如 var str = '{"name":"huangxiaojian","age&qu ...
- unicode-range 字体混搭(转)
最先想到的方法是定义两个拥有不同字体CSS类分别赋予不同的元素. <div class="font1"></div> <div class=" ...
- poj1745 dp
题目链接:http://poj.org/problem?id=1745 类似的题目之前写过一个差不多的(链接:http://www.cnblogs.com/a-clown/p/5982611.html ...
- XSS 跨站脚本攻击之构造剖析(一)
1.XSS-Filter:跨站脚本过滤器,用于分析用户提交的输入,并消除潜在的跨站脚本攻击 (1)XSS Filter实际上是一段精心编写的过滤函数作用是过滤XSS跨站脚本代码: (2)绕过XSS F ...