http

一、什么是Http协议

  1. 定义 

    超文本传输协议(HTTP,HyperText Transfer Protocol)定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传给浏览器。从
    层次的角度看,Http是面向(transaction-oriented)应用层协议,它是万维网能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础

  2. 工作流程

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

    如果在以上过程中某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出,对于用户来说,这些过程是由Http自己完成的,用户只要用鼠标点击,等待信息显示就可以了



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

  3. URL

    统一资源定位符(URL,英语Uniform Resource Locator的缩写)也被称为网页地址,是因特网上的标准的资源地址。
    URL的格式由下列三部分组成:
    第一部分是协议(或称为服务方式);
    第二部分是存有该资源的的主机IP地址(有时也包括端口号);
    第三部分是主机资源的具体地址。如目录和文件名等。
    第一部分和第二部分之间用“://”符号隔开,第二部分和第三部分用“/”符号隔开。第一部分和第二部分是不可缺少的。第三部分有时可以省略。现在所有的URI都是URL


  4. Tcp三次握手

    SYN (synchronize[汉译:同步,同步发生])。SYN是TCP/IP建立连接时使用的握手信号。在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发出一个SYN消息,服务器使用SYN-ACK应答表示接收到了这个消息,最后客户机再以ACK(Acknowledgement[汉译:确认字符 ,在数据通信传输中,接收站发给发送站的一种传输控制字符。它表示确认发来的数据已经接受无误。 ])消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。

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

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



    现实生活中的例子男孩追女孩可以很好的表现Tcp的三次握



  5. http请求头信息

    Remote Address:220.181.12.218:80
    Request URL:http://126.com/
    Request Method:GET
    Status Code:200 OK
    Cache-Control:max-age=3600
    Connection:keep-alive
    Content-Encoding:gzip
    Content-Type:text/html
    Date:Sun, 03 Apr 2016 09:25:41 GMT
    Expires:Sun, 03 Apr 2016 10:00:22 GMT
    Last-Modified:Wed, 30 Mar 2016 08:33:29 GMT
    Server:nginx
    Transfer-Encoding:chunked
    Vary:Accept-Encoding
    Vary:Accept-Encoding
    X-Cache:HIT from ntes_cache
    Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Encoding:gzip, deflate, sdch
    Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
    Connection:keep-alive
    Cookie:nts_mail_user=w027000:-1:1; P_INFO=w027000@126.com|1442733332|0|other|11&22|shx&1442733332&mail126#shx&140100#10#0#0|150846&0|urs&easyread&mail163&mail126|w027000@126.com
    Host:126.com
    Upgrade-Insecure-Requests:1
    User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36


  6. Http请求的方式

    GET: 请求指定的页面信息,并返回实体主体。
    POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。
    HEAD: 只请求页面的首部。
    PUT: 从客户端向服务器传送的数据取代指定的文档的内容。
    DELETE: 请求服务器删除指定的页面。
    OPTIONS: 允许客户端查看服务器的性能。
    TRACE: 请求服务器在响应中的实体主体部分返回所得到的内容。
    PATCH: 实体中包含一个表,表中说明与该URI所表示的原内容的区别。
    MOVE: 请求服务器将指定的页面移至另一个网络地址。
    COPY: 请求服务器将指定的页面拷贝至另一个网络地址。
    LINK: 请求服务器建立链接关系。
    UNLINK: 断开链接关系。
    WRAPPED: 允许客户端发送经过封装的请求。


  7. Http响应码信息

    ① 客户方错误
    100  继续
    101  交换协议
    ② 成功
    200  OK
    201  已创建
    202  接收
    203  非认证信息
    204  无内容
    205  重置内容
    206  部分内容
    ③ 重定向
    300  多路选择
    301  永久转移
    302  暂时转移
    303  参见其它
    304  未修改(Not Modified)
    305  使用代理
    ④ 客户方错误
    400  错误请求(Bad Request)
    401  未认证
    402  需要付费
    403  禁止(Forbidden)
    404  未找到(Not Found)
    405  方法不允许
    406  不接受
    407  需要代理认证
    408  请求超时
    409  冲突
    410  失败
    411  需要长度
    412  条件失败
    413  请求实体太大
    414  请求URI太长
    415  不支持媒体类型
    ⑤ 服务器错误
    500  服务器内部错误
    501  未实现(Not Implemented)
    502  网关失败
    504  网关超时
    505 HTTP版本不支持


  8. Http协议的主要特点可概括如下:

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


  9. OSI七层协议

    开放系统互连参考模型 (Open System Interconnect 简称OSI)是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统提供了一种功能结构的框架。它从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

    第一层:物理层
    物理层规定了激活、维持、关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性。该层为上层协议提供了一个传输数据的物理媒体。在这一层,数据的单位称为比特(bit)。 属于物理层定义的典型规范代表包括:EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-45、fddi令牌环网等。

    第二层:数据链路层
    数据链路层在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。 在这一层,数据的单位称为帧(frame)。
    数据链路层协议的代表包括:ARP、RARP、SDLC、HDLC、PPP、STP、帧中继等。
    (802.2、802.3ATM、HDLC、FRAME RELAY )
    ARP是网络层的协议,但是它所工作的内容是链路层的。具体来说应该是在网络层;

    第三层:网络层
    网络层负责对子网间的数据包进行路由选择。网络层还可以实现拥塞控制、网际互连等功能。
    在这一层,数据的单位称为数据包(packet)。
    网络层协议的代表包括:IP、IPX、RIP、OSPF等。
    (IP、IPX、APPLETALK、ICMP)

    第四层:传输层
    传输层是第一个端到端,即主机到主机的层次。传输层负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外,传输层还要处理端到端的差错控制和流量控制问题。
    在这一层,数据的单位称为数据段(segment)。
    传输层协议的代表包括:TCP、UDP、SPX等。

    第五层:会话层
    会话层管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话。会话层还利用在数据中插入校验点来实现数据的同步。
    RPC、SQL、NFS 、X WINDOWS、ASP
     
    第六层:表示层
    表示层对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机的应用程序理解。表示层的数据转换包括数据的加密、压缩、格式转换等。
    ASCII、PICT、TIFF、JPEG、 MIDI、MPEG
     
    第七层:应用层
    应用层为操作系统或网络应用程序提供访问网络服务的接口。
    应用层协议的代表包括:Telnet、FTP、HTTP、SNMP等。
    HTTP,FTP,SNMP等
    加密解密是在网络层完成的

    七层理解
    物理层:物理接口规范,传输比特流,网卡是工作在物理层的。
    数据层:成帧,保证帧的无误传输,MAC地址,形成EHTHERNET帧
    网络层:路由选择,流量控制,IP地址,形成IP包
    传输层:端口地址,如HTTP对应80端口。TCP和UDP工作于该层,还有就是差错校验和流量控制。
    会话层:组织两个会话进程之间的通信,并管理数据的交换使用NETBIOS和WINSOCK协议。QQ等软件进行通讯因该是工作在会话层的。
    表示层:使得不同操作系统之间通信成为可能。
    应用层:对应于各个应用软件


  10. tcp/ip四层协议





二、http1.0和http1.1区别


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


三、HttpUrlConnection的介绍

以下代码段是用webview加载百度网页

public void run() {
        try {
            URL url = new URL(mUrl);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("GET");
            httpURLConnection.setReadTimeout(3000);
            if(httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK){
                InputStream inputStream = httpURLConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                final StringBuffer sb = new StringBuffer();
                String str;
                while((str=bufferedReader.readLine()) != null){
                    sb.append(str);
                }
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mWebView.loadData(sb.toString(),"text/html;charset=utf-8",null);
                    }
                });
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


以下代码段是下载图片且显示

public void run() {
        try {
            URL url = new URL(mUrl);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("GET");
            httpURLConnection.setReadTimeout(3000);
            if(httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK){
                InputStream inputStream = httpURLConnection.getInputStream();
                FileOutputStream fileOutputStream = new FileOutputStream(new File("/sdcard/1111.jpg"));
                byte []data = new byte[2 *1024];
                int len = 0;
                while ((len=inputStream.read(data)) != -1){
                    fileOutputStream.write(data,0,len);
                }
                final Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/1111.jpg");
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mImageView.setImageBitmap(bitmap);
                    }
                });
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }



四、Http传递参数信息和传递方式post、get


jsp代码
<form action="${pageContext.request.contextPath}/servlet/MyFirstServlet" method="post">
  			用户名 : <input type="text" name="name"/><br><br><br>
  			密    码 : <input type="password" name="password"/><br><br><br>
  			<input type="submit" />
</form>

Servlet

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String name = request.getParameter("name");
		String password = request.getParameter("password");
		
		PrintWriter out = response.getWriter();
		out.print("name-->" + name + "  password--->" + password);
		System.out.println("name-->" + name + "  password--->" + password);
	}


android

String path = "http://10.0.1.55:8080/servlet/MyFirstServlet?name=" + name.getText() + "&password=" + password.getText();
  // doData(path,"GET");
  doData(path,"POST");

private void doData(final String path,final String method){
       new Thread(){
           @Override
           public void run() {
               try {
                   String str1 = path.split("\\?")[1];
                   String strUrl = "";
                   if(method.equals("GET")){
                       strUrl = path;
                   }else{
                       strUrl = path.split("\\?")[0];
                   }
                   URL url = new URL(strUrl);
                   HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                   httpURLConnection.setRequestMethod(method);
                   httpURLConnection.setConnectTimeout(3000);
                   if(method.equals("POST")){
                       OutputStream os = httpURLConnection.getOutputStream();
                       os.write(str1.getBytes());
                   }
                   InputStream  io = httpURLConnection.getInputStream();
                   BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(io));
                   StringBuffer sb = new StringBuffer();
                   String str;
                   while((str=bufferedReader.readLine()) != null){
                       sb.append(str);
                   }
                   Log.i("zjh","sb---->" + sb.toString());
               } catch (MalformedURLException e) {
                   e.printStackTrace();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
       }.start();
    }








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值