1、什么是http协议?
超文本传送协议(HTTP-Hypertext transfer protocol)定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。从层次的角度看,HTTP是面向(transaction-oriented)应用协议层,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。
工作流程
一个HTTP操作称为一个事务,其工作过程可分为四步:
1)首先客户机与服务器需要建立链接,只要单击某个超级链接,HTTP的工作开始。
2)建立链接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后面是MIME信息
包括请求修饰符、客户机信息和可能的内容。
3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后面是MIME信息包括服务器信息、实体信息和可能的内容。
4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机 与服务器断开连接
Http协议永远都是客户端发起请求,服务器回送响应。这样就限制了使用HTTP,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端。 HTTP是一个无状态的协议 ,同一个客户端的这次请求和上次请求是没有对应关系的。
URL:
统一资源定位符URL(Uniform Resource Locator)也被称为网页地址,是因特网上标准的资源的地址。
URL的格式由下列三部分构成:
第一部分为协议(或称为服务方式);
第二部分为IP地址(一般是域名表示IP地址,有时包括端口号);
第三部分为主机资源的具体地址,如目录和文件名。
第一部分和第二部分之间用“://”符号隔开,第二部分和第三部分用“/”隔开。第一部分和第二部分是必不可少的,第三部分可以省略。现在几乎所有的URI都是URL。
TCP三次握手:
SYN(synchronous)是TCP/IP建立连接时使用的握手信号,在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发出一个SYN信息,服务器使用SYN+ACK应答表示接受到了这个信息,最后客户机再以ACK信息响应,这样在客户机和服务器机建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。
ACK(Acknowledgement)即确认字符,在数据通信中,接收站发送给发送站的一种传输类控制字符。表示发来的数据已确认接受无误。
Http请求头:
Request URL:请求的地址 http://sports.qq.com/nba/
Request Method:请求方法 GET
Status Code:请求状态 200 OK
Accept:可以接受的文件格式
Accept-Encoding:可接受的编码
Accept-Language:可接受的语言
Connection:连接方式
Host:主机地址
Http请求主要有两种方式:
GET:请求获取Request-URI所标示的资源
POST:在Request-URI所标示的资源后附加新的数据
Http响应头:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态码必须和WWW-Authenticate 报头域一起使用
403 Forbidden// 服务器收到请求,但是拒绝提供服务
404 NotFound//请求资源不存在
500 Internal Server Error//服务器发生不可预期的错误
503 Server Unavailable//服务器当前不能处理客户端请求,一段时间后可能恢复正常
HTTP协议的特点:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并受到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
OSI七层协议:
OSI参考模型将整个网络通信功能划分为七个层次,由低到高分别是物理层PH、数据链路层DL、网络层N、传输层T、会话层S、表示层P、应用层A。每层完成一定的功能,每层都直接为期上层服务,并且所有层次都互相支持。第四层到第七层主要负责互操作性,而一层到三层则用于创造两个网络设备间的物理连接。
http协议属于应用层
图解
TCP/IP四层协议:
图解
HTTP 1.0与1.1的区别:
1)HTTP/1.0每次请求都需要建立新的TCP连接,连接不能复用。
2)HTTP/1.1新的请求可以在上次请求建立的TCP连接之上发送,连接可以复用。优点是减少重复进行TCP三次握手的开销,提高效率。
3)HTTP1.1在Request消息头里头多了一个Host域,HTTP1.0则没有这个域。Host:www.w3.org
4)HTTP1.1增加了OPTIONS,PUT,DELETE,TRACE,CONNECT这些Request方法
HttpUriConnection介绍:
例子1:访问百度网址
步骤:
1、新建线程,在run方法中创建URL对象、创建HttpURLConnection对象
2、设置HttpURLConnection.setReadTimeout(5000);
HttpURLConnection.setRequestMethod(“GET”);
3、获取输入流:BufferedReader read = new BufferedRead(new
InputStreamReader(conn.getInputStream()));
4、在Handler.post(Runnable runnable)Runnable的run方法中实现
webview.loadData(String data ,String mimeType , String encoding);
5、在主线程中new HttpThread(String url,WebView
webView,Handler handler);
例子2:加载网络图片显示到本地
1、新建线程,在run方法中创建URL对象、创建HttpURLConnection对象
2、设置
HttpURLConnection.setReadTimeout(5000);
HttpURLConnection.setRequestMethod(“GET”);
HttpURLConnection.setDoInput(true);
InputStream in = conn.getInputStream();//获取URL对应输入流
3、在SD卡中新建文件
将文件写入到SD卡中
用BitmapFactory.decodeFile方法将文件转换为Bitmap格式
4、在Handler.post(Runnable runnable)Runnable的run方法中实现
imageView.setImageBitmap(bitmap);
5、在主线程中new HttpThread(String url,ImageView
imageView ,Handler handler);
源码:
package com.example.http;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.os.Handler;
import android.webkit.WebView;
import android.widget.ImageView;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpThread extends Thread {
private WebView webView;
private String url;
private Handler handler;
private ImageView imageView;
public HttpThread(String url, WebView webView, Handler handler) {
this.url = url;
this.handler = handler;
this.webView = webView;
}
public HttpThread(String url, ImageView imageView, Handler handler) {
this.url = url;
this.handler = handler;
this.imageView = imageView;
}
@Override
public void run() {
try {
URL httpUrl = new URL(url);
try {
HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();
conn.setReadTimeout(5000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
InputStream in = conn.getInputStream();
FileOutputStream out = null;
File downLoadFile = null;
String fileName = String.valueOf(System.currentTimeMillis());
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File parent = Environment.getExternalStorageDirectory();
downLoadFile = new File(parent, fileName);
out = new FileOutputStream(downLoadFile);
byte[] b = new byte[2*1024];
int len;
if (out != null) {
while((len=in.read(b))!=-1){
out.write(b,0,len);
}
}
final Bitmap bitmap = BitmapFactory.decodeFile(downLoadFile.getAbsolutePath());
handler.post(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap);
}
});
}
// final StringBuffer sb = new StringBuffer();
// BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
// String str;
// while ((str = reader.readLine()) != null) {
// sb.append(str);
// }
// handler.post(new Runnable() {
// @Override
// public void run() {
// webView.loadData(sb.toString(), "text/html;charset=utf-8", null);
// }
// });
} catch (Exception e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}