Java Web---HTTP应用层协议

一、网络通讯

1.计算机间通讯的要素:

(1)IP地址:主机标识
(2)端口:数据的出入口,对外提供服务就是对外暴露端口。网络应用软件其实就是在处理指定端口的数据。
(3)协议:通讯的规则。TCP传输层协议,HTTP应用层协议。

2.HTTP协议

(1)超文本传输协议

(2)通过客户端IE访问自定义服务端演示请求规则

(3)Http1.0和Http1.1的区别:

–》1.0在一次连接断开中只有一个请求和应答
–》1.1在一次连接中可以有多个请求和应答
–》广泛使用1.1,因为支持连续连接,避免了多次连接和关闭带来的消耗和延时。
注意,如果使用http1.0版本进行与服务端通信时,如果在请求消息头中加入字段Connection:keep-alive,那么请求就不会中断,这是解决1.0只有一个请求和应答的问题的方法。

3.写个简单的服务器程序

import java.io.*;
import java.net.*;
class  Server/*一个简单的服务器*/
{
    public static void main(String[] args) throws Exception
    {
        ServerSocket ss=new ServerSocket(10000);
        Socket s=ss.accept();
        System.out.println(s.getInetAddress().getHostAddress());
        InputStream in=s.getInputStream();

        byte[] buf=new byte[1024];
        int num=in.read(buf);
        System.out.println(new String(buf,0,num));
        PrintWriter out=new PrintWriter(s.getOutputStream);
        out.println("注册成功");
        s.close();
        ss.close();
        }
}

访问上述服务器程序,只需在浏览器地址栏中输入:
http://localhost:10000
访问步骤:
 1. 编译运行服务器程序,使服务处于监听状态。
 2. 在地址栏中输入http://localhost:10000
 3. cmd控制端输出以下内容:
GET / HTTP/1.1
Host: localhost:10000
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/
47.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive

4.在cmd控制端下访问Tomcat服务器提供的服务

步骤:

  1. 在cmd控制端下输入“startup”命令开启Tomcat服务;
  2. 打开cmd,输入“telnet localhost 8080”访问服务器的8080端口;
  3. 按下“Ctrl”+“]”键,实现本地回写;
  4. 输入以下命令:
HTTP请求头:
GET /myweb/qq.html HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/
47.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive

注意提前编辑好,因为telnet有等待时间限制,时间过长就自动断开连接了。
请求消息头字段解释说明:
(1)Accept:用于告诉服务器端客户端可以处理的MIME类型;
(2)Accept-Charset:用于指定客户端可以使用的字符集;
(3)Accept-Encoding:用于指定客户端用于解码的方式。当传输较大的数据时,压缩传输可以提高效率,那么就要告诉服务器端是以什么方式压缩的;
(4)Accept-Language:刘拉起支持的语言,服务端可以根据该消息头返回与客户端支持语言相匹配的数据;
(5)Host:要访问的主机,一个服务器上可以有多个主机;
(6)if-Modified-Since:浏览器所缓存文件的最后时间,与服务器的Last-Modified相对应;
(7)Referer:用于指明浏览器发送的请求,是单击哪个网站上的超链接导航过来的,浏览器发送Referer请求头可以让服务端指导这个请求的起源url。这样可以统计出访问本网站的客户来源,明确广告的收效。但是如果在地址栏中写入地址访问,是不会有该请求头的。
(8)Connection:close|keep-alive http1.1默认是keep-alive;
(9)Accept-Language:通过Internet选项,语言按钮,添加新的语言,再一次请求,会看到Accept-Language的值发生了改变。说明客户端在告诉服务器它的一些自身信息,这样浏览器可以发回一些匹配信息。

  1. HTTP应答——返回结果如下:
HTT响应头:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"22-1466993994048"
Last-Modified: Mon, 27 Jun 2016 02:19:54 GMT
Content-Type: text/html
Content-Length: 22
Date: Tue, 28 Jun 2016 01:03:00 GMT

qqqqqqqqqqqqq

HTTP应答格式由三部分组成:
(1)HTTP协议的版本,状态码,描述
(2)响应消息头
(3)响应正文
通过HttpWatch可以查看浏览器的请求和应答内容。

最后显示:遗失对主机的连接。即等待时间已到,自动断开连接。
状态码(返回码):将客户端与服务端通信出现的各种情况用数字的方式体现。由三个十进制数组成。
100~199:表示接收请求,要求客户端继续提交下一次请求才能完成处理过程;
200~299:表示成功接收请求并已完成整个处理过程;
300~399:为了完成请求,客户端需要进一步细化请求;
400~499:客户端的请求有错误;
500~599:服务端出现错误;
常见状态码:
200:表示成功,返回正常请求结果;
302:表示要访问的资源一静一动,去指定位置访问;
304:表示客户端缓存资源是否是最新的;
404:服务器上不存在客户端请求的资源;
500:服务器内部发生的错误。

关于http返回码的详解可参考:301、404、200、304等HTTP状态

–》Location:
告诉浏览器去哪里访问资源,可以和302结合应用。
–》Content-Encoding:gzip
用于指定试题内容当前的压缩编码方式gzip,浏览器可以通过Accept-Encoding来告诉服务器支持的压缩方式,服务器通过Content-Encoding来告诉浏览器实体的压缩方式。
–》Content-Length:80
用于表示服务器发送的实体的大小。
–》Content-Language:zh-cn
是服务器告诉浏览器发回的实体是什么语言。

HTTP请求

客户端向服务器端获取指定资源,并将客户端的一些属性信息一并发送给服务端。
请求格式由三部分组成:

  1. 请求方式 url http协议的版本;
  2. 请求消息头;
  3. 请求正文
    注意:请求头和请求正文用空行隔开

请求行信息

GET /hello.html HTTP/1.1
请求方式:
GET,POST,HEAD,DELETE,OPTIONS,PUT,TRACE
url:请求的资源,如果是GET提交后面可以有参数信息,如:
/hello.html?id=001&name=zhangsan

GET和POST区别

  1. 对于提交的信息:
    GET:会以url参数的形式显示在地址栏上;
    POST:不会显示;
    对于敏感信息(如密码,账号)POST提交较安全。
  2. 对于信息的体积
    GET:因为都显示在地址栏,地址栏是有限制度的,IE最大支持2083字节;
    POST:数据体积没有限制。
  3. 对于信息的封装
    GET:将信息封装到请求行中;
    POST:将信息封装到请求正文(数据体)中;
    关于浏览器地址栏最多能存放的地址字节数可以参考博文各浏览器地址栏最大可接受字节数

访问http://localhost:8080服务的HTML示例


<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
        <meta http-equiv="Content-Language" content="zh_cn" />
        <meta name="keywords" content="register" />
        <title>
            注册页面
        title>
        <style type="text/css">
        .content{
            width:50%;
            height:auto;
            position:relative;
        }
        .content.row{
            float:left;
        }
        span.name{
            width:30%;
            text-align:right;
            background-color:red;
        }
        span.value{
            width:70%;
            text-align:left;
        }
        style>
    head>
    <body>
    <form action="http://localhost:10000" method="get">
    <fieldset>
        <legend>用户注册信息legend>
        <div class="content">
            <div class="row"><span class="name">用户名:span><span class="value"><input type="text" name="username"/>span>div>
            <div class="row"><span class="name">密码:span><span class="value"><input type="password" name="password"/>span>div>
            <div class="row"><input type="submit" value="submit"/>div>
    fieldset>
    body>
html>

注意,一般表单提交都是用“post”提交方式,因为提交的内容可能包含中文,Tomcat默认编解码方式是“iso8859-1”,如果提交的form表单数据是用utf-8编码的,那么可以在Tomcat服务器端通过setCharacterEncoding设置字符编码为“utf-8”就可以了。而用“get”方式提交表单就解决不了乱码的问题了,因为数据封装位置不一样,get是将提交的数据封装在请求行中,而post是将提交的数据封装在请求正文(数据体)中,Tomcat服务器setCharacterEncoding只对请求正文中的数据进行编解码处理,所以post编码问题可以得到解决,而get编码问题无法解决。要想解决get乱码的问题,可以对乱码数据先编码再解码的方式解决,这个后续详细说明解决步骤。

默认情况下,tomcat使用的的编码方式:iso8859-1
修改tomcat下的conf/server.xml文件
找到如下代码:

这段代码规定了Tomcat监听HTTP请求的端口号等信息。
可以在这里添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理get请求。

修改完成后:

你可能感兴趣的:(java,Java-Web,HTTP协议)