HTTP

来源:互联网 发布:欧润网络 编辑:程序博客网 时间:2024/06/07 01:17

1.什么是HTTP协议?

超文本传送协议(http)定义了浏览器怎么向万维网服务器请求万维网文档,以及服务器怎样把文档传给浏览器。从层次的角度看,HTTP是面向应用层协议的,它是万维网上能够可靠地交换文件(文本,声音,图片等)的重要基础


2.HTTP工作流程

一次HTTP操作称为一个事务,其工作过程可分为四步
1.)首先客户机与服务器需要建立连接。重要单机某个超级链接,HTTP的工作就开始了。
2.)建立连接后,客户机发送一个请求给服务器,请求方式为:统一资源定位符(URL)、协议版本号、后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
3.)服务器接受到请求后,给了相应的响应信息,其格式为一个状态行,包括信息的协议版本号,一个成功或错误的代码,后边是MIME信息包括服务器信息,实体信息和可能的内容
4.)客户端接收服务器返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接

2.1HTTP是在TCP/IP协议之上的的,先进行TCP/IP连接,即进行三次握手

2.2HTTP协议永远都是客户端发起请求,服务器回送响应,这样就限制了使用HTTP协议,无法实现客户端没有发生请求的时候,服务器将消息推送给客户端。HTTP协议是一个无状态的协议,同一个客户端的这次请求与上次请求是没有对应关系的

2.3URL(统一资源定位符)
这里写图片描述


3.TCP/IP基础-三次握手

3.1SYN(synchronous)是TCP/IP建立连接时使用的握手信号。在客户机和服务器之间建立正常连接的TCP网络连接时,客户机首先发送一个SYN消息,服务器使用SYN+ACK应答表示接收到了这个消息,最后客户机再以ACK消息响应。这样客户机和服务器之间才能建立可靠的TCP连接,数据才可以在客户机和服务器之间传递。

ACK(Acknowledgement),即确认字符,在数据通信中接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误。
这里写图片描述


4.HTTP请求头信息

Request URL: http://www.baidu.com/
Request Method:GET、POST
Request Code:200 ok
…等


5.HTTP响应头信息

响应码
客户端错误:
200 Ok // 客户端请求成功
400 Bad Request // 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized // 请求未经授权,这个状态代码必须和www-Authenticate报头域一起使用
403 Forbidden // 服务器收到请求,但是拒绝提供服务
404 Not Found // 请求资源不存在 eg.输入错误的URL

服务器错误:
500 Internal Server Error // 服务器发送不可预计的错误
503 Server Unavailable // 服务器当前不能处理客户机的请求,一段时间后可能恢复


6.HTTP协议的特点

1.)支持客户/服务器模式(B/S)
2.)简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的又GET、POST、HEAD。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因此通信速度很快。
3.)灵活:HTTP允许传输任何类型的数据对象。正在传输的类型由Content-Type加以标记。
4.)无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并受到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.)无状态:HTTP协议是无状态协议。无状态是指协议对于事务没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快


7.七层协议

国际标准化组织ISO于1981年正式推荐了一个网络系统结构—七层参考模型,也叫做开放系统互连模型(Open System Interconnection,OSI).
OSI参考模型将整个网络通信功能划分为七个层次。
它们由低到高分别是 物理层(PH),数据链路层(DL),网络层(N),传输层(T),会话层(S),表示层(P),应用层(A)

这里写图片描述


8.HTTP1.0和HTTP1.1的区别

HTTP/1.0 每次请求都需要建立新的TCP连接,连接不能复用
HTTP/1.1 新的请求可以在上次请求建立的TCP连接之上发送,连接可以复用。优点是减少重复进行TCP三次握手的开销,提高效率
HTTP1.1 在Request消息头里多了一个Host域,HTTP/1.0则没有这个域。Host:www.w3.org
HTTP1.1 增加了OPTIONS,PUT,DELETE.TRACE,CONNECT这些Request方法


9.HttpUrlConnection的使用

http://blog.csdn.net/u010542146/article/details/50088261


10.GET、POST传递参数

Main

final   EditText edName = (EditText) findViewById(R.id.editText1);    final   EditText edPsw = (EditText) findViewById(R.id.editText2);        final String url = "http://192.168.56.1:8080/Day0225/MyServlet";        Button bt = (Button) findViewById(R.id.button1);        bt.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                final String name = edName.getText().toString();                final String psw = edPsw.getText().toString();                new MyThread(url, name, psw).start();            }        });

MyThread

public class MyThread extends Thread {        String url;        String name;        String psw;        public MyThread(String url,String name,String psw) {            this.url = url;            this.name = name;            this.psw = psw;        }        @Override        public void run() {//          doGet();            doPost();        }        private void doGet() {            url = url+"?name="+name+"&psw="+psw;            try {                URL httpUrl = new URL(url);                HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();                conn.setConnectTimeout(5000);                conn.setRequestMethod("GET");                BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));                StringBuilder builder = new StringBuilder();                String line;                if ((line=reader.readLine())!=null) {                    builder.append(line);                }            } catch (MalformedURLException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            }        }        private void doPost() {            try {                URL httpUrl = new URL(url);                HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();                conn.setConnectTimeout(5000);//数据添加                OutputStream out = conn.getOutputStream();                String string = "name="+name+"&psw="+psw;                out.write(string.getBytes());//                BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));                StringBuilder builder = new StringBuilder();                String line;                if ((line=reader.readLine())!=null) {                    builder.append(line);                }            } catch (MalformedURLException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            }        }    }

11.乱码处理

服务端

String name = (String) request.getParameter("name");        String name1 = new String(name.getBytes("iso-8859-1"),"utf-8");        //**name1为转码后的**        String psw = (String) request.getParameter("psw");        System.out.println("name = "+name+" name1 = "+name1+"  psw = "+psw);        response.setContentType("text/html;charset=utf-8");        PrintWriter out = response.getWriter();        out.write("name = "+name+" name1 = "+name1+"  psw = "+psw);

客户端使用GET方法传递参数(好像不需要使用URLEncoder也不会出现“??”)

try {                url = url+"?name="+URLEncoder.encode(name,"utf-8")+"&psw="+psw;            } catch (UnsupportedEncodingException e1) {                e1.printStackTrace();            }

12.多线程下载资源(图片为例)

图片资源放置WebContent目录下
这里写图片描述

Main

public class MainActivity extends Activity {    TextView textView;    private int count = 0;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        final Handler handler = new Handler(){            @Override            public void handleMessage(Message msg) {                if(msg.what == 1) {                    count++;                    if (count == 3) {                    textView.setText("ok");                    }                }            }        };        textView = (TextView) findViewById(R.id.textView1);        Button button = (Button) findViewById(R.id.button1);        button.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                new Thread(new Runnable() {                    @Override                    public void run() {                        new DownLoad(handler).downLoadFile("http://192.168.56.1:8080/Day0225/girl.jpg");                    }                }).start();                         }        });    }}

DownLoad

package com.example.day0226;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.util.concurrent.Executor;import java.util.concurrent.Executors;import android.os.Environment;import android.os.Handler;public class DownLoad {    Handler handler;    public DownLoad(Handler handler) {        this.handler = handler;    }    //创建线程池    private Executor threadPool = Executors.newFixedThreadPool(3);    public void downLoadFile(String url) {        try {            URL httpUrl = new URL(url);            HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();            conn.setReadTimeout(5000);            conn.setRequestMethod("GET");            //拿到下载图片总体的长度            int count = conn.getContentLength();            int block = count/3;            String fileName = getFileName(url);            File parent = Environment.getExternalStorageDirectory();            File fileDownload = new File(parent,fileName);            /** 11 个字节             *  第一个线程 0-2             *  第二个线程 3-5             *  第三个线程 6-10             */            for(int i=0; i<3; i++) {                long start = i*block;                long end = (i+1)*block-1;                if (i == 2) {                    end = count;                }                DownLoadRunnable runnable = new DownLoadRunnable(url, fileDownload.getAbsolutePath(), start, end,handler);                //通过线程池提交任务                threadPool.execute(runnable);            }        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }    static class DownLoadRunnable implements Runnable {        private String url;        private String fileName;        private long start;        private long end;        private Handler handler;        public DownLoadRunnable(String url,String fileName,long start,long end,Handler handler) {            this.url = url;            this.fileName = fileName;            this.start = start;            this.end = end;            this.handler = handler;        }        @Override        public void run() {            try {                URL httpUrl = new URL(url);                HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();                conn.setReadTimeout(5000);                conn.setRequestMethod("GET");                //指定请求的长度                conn.setRequestProperty("Range", "bytes="+start+"-"+end);                //往本地文件进行写,"rwd"=可读可写可执行                RandomAccessFile access = new RandomAccessFile(new File(fileName), "rwd");                //对指定区域进行读写                access.seek(start);                InputStream in = conn.getInputStream();                byte[] b = new byte[1024*4];                int len = 0;                while((len=in.read(b))!=-1) {                    access.write(b,0,len);                }                if (access != null) {                    access.close();                }                if(in != null) {                    in.close();                }                handler.sendEmptyMessage(1);            } catch (MalformedURLException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            }        }    }    public String getFileName(String url) {        return url.substring(url.lastIndexOf("/"));    }}

用到的知识点:
1.HTTP协议字段 Range “bytes=”+start+”-“+end
2.RandomAccessFile 设置吸入的位置
3.开启线程发送网络请求


13.上传图片

tomcat版本选择7.0的3.0

JSP

<form action="UploadServlet" method="post" enctype="multipart/form-data"><input type="file" name="file"><br><input type="submit" value="submit"><br></form>

UploadServlet

import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.MultipartConfig;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.Part;/** * Servlet implementation class UploadServlet */@WebServlet("/UploadServlet")//指定路径为D盘下@MultipartConfig(        location = "D:\\"        )public class UploadServlet extends HttpServlet {    private static final long serialVersionUID = 1L;    /**     * @see HttpServlet#HttpServlet()     */    public UploadServlet() {        super();        // TODO Auto-generated constructor stub    }    /**     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)     */    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        doPost(request, response);    }    /**     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)     */    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        Part part = request.getPart("file");        part.write("girl.jpg");        System.out.println("ok");    }}

即把图片上传到D盘下,固定文件名为”girl.jpg“
这里写图片描述

HttpUrlConnection上传
实际上是要按照下图的格式才能上传
这里写图片描述
Main

File parent = Environment.getExternalStorageDirectory();                File file = new File(parent,"girl.jpg");                String fileName = file.getAbsolutePath();                String url = "http://192.168.56.1:8080/Day0226/UploadServlet";                new UpLoadThread(url, fileName).start();

UpLoadThread

public class UpLoadThread extends Thread {        String url;        String fileName;        String boundary = "---------------------------184811307910651";        String prefix = "--";        String end = "\r\n";        public UpLoadThread(String url, String fileName) {            this.url = url;            this.fileName = fileName;        }        @Override        public void run() {            try {                URL httpUrl = new URL(url);                HttpURLConnection conn = (HttpURLConnection) httpUrl.openConnection();                conn.setReadTimeout(5000);                conn.setRequestMethod("POST");                //允许读入                conn.setDoInput(true);                //允许输出                conn.setDoOutput(true);                conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);                DataOutputStream out = new DataOutputStream(conn.getOutputStream());                out.writeBytes(prefix+boundary+end);                out.writeBytes("Content-Disposition: form-data; "+"name=\"file\";filename=\""+"girl.jpg"+"\""+end);                out.writeBytes(end);                @SuppressWarnings("resource")                FileInputStream fileInputStream = new FileInputStream(new File(fileName));                byte[] b = new byte[1024*4];                int len = 0;                while((len=fileInputStream.read(b))!=-1) {                    out.write(b,0,len);                }                out.writeBytes(end);                out.writeBytes(prefix+boundary+prefix+end);                out.flush();                BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));                StringBuffer buffer = new StringBuffer();                String str;                while((str=reader.readLine())!=null) {                    buffer.append(str);                }                Log.v("TAG", buffer.toString());                if (out != null) {                    out.close();                }                if (reader != null) {                    reader.close();                }            } catch (MalformedURLException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            }        }    }

使用HttpClient上传
要导入2个jar包
httpmime-4.4-beta1
httpcore-4.4-beta1
注意:高版本的jar会报错!(如httpmime-4.5.1)

public class ClientPostThread  extends Thread {        @SuppressWarnings("deprecation")        @Override        public void run() {            HttpClient client = new DefaultHttpClient();            String url = "http://192.168.56.1:8080/Day0226/UploadServlet";            HttpPost post = new HttpPost(url);            MultipartEntity entity = new MultipartEntity();            File parent = Environment.getExternalStorageDirectory();            File file = new File(parent,"girl.jpg");            FileBody body = new FileBody(file);            entity.addPart("file",body);            post.setEntity(entity);            try {                HttpResponse response = client.execute(post);                if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {                    Log.v("TAG", EntityUtils.toString(response.getEntity()));                }            } catch (ClientProtocolException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            }        }    }

转载于:http://www.imooc.com/learn/304

0 0