HTTP协议是网络应用层协议,建立在TCP/IP协议基础上。
HTTP协议基于客户/服务器模式,客户端主动发出HTTP请求,服务器接收HTTP请求,返回HTTP响应结果。HTTP协议对HTTP请求,以及响应的格式作了明确的规定。
HTTP客户程序和HTTP服务器分别由不同的软件开发商提供,它们都可以用任意的编程语言编写。用VC编写的HTTP客户程序能否与用java编写的HTTP服务器顺利通信呢?答案是肯定的。HTTP协议严格规定了HTTP请求和HTTP响应的数据格式,只要HTTP服务器与客户程序都遵守HTTP协议。
-------
HTTP请求格式:
HTTP协议规定,HTTP请求由3部分,分别是
1、请求方式、URI、HTTP协议的版本
2、请求头(Rquest Header)
3、请求正文(Reuqest Content)
如:
POST/hello.htm HTTP/1.1
Accept:image/gif,image/jpeg,*/*
Referer:http://locallost/login.htm
Accept-Language:en,zh-cn;q=0.5
Content-Type:application/x-www-form-rulencoded
Accept-Encoding:gzip,deflate
User-Agent:Mozila/4.0(compatible;MSIE6.0;Windows NT 5.0)
Host:localhost
Content-Length:43
Connection:Keep-Alive
Cache-Control:no-cache
空行
username=weiqin&password=123&submit=submit
-----
1、请求方式、URI、HTTP协议的版本
POST /hello.html HTTP/1.1
HEAD:客户程序和服务器之间交流一些颞部数据,服务器不会返回具体的文档。当使用GET和POST方法时,服务器最后都将特定的文档返回给客户程序。
2、请求头
请求头包含许多有关客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器的类型、所用的语言、请求正文,以及请求正文的长度等。
3、请求正文
HTTP协议规定,请求头和请求正文之间必须以空行分隔(z只有CRLF符号的行),
这个空行非常重要,它表示请求头已经结束,接下来时请求正文。请求正文可以包含客户以POST方式提交的表单数据:username=weiqin&password=123&submit=submit
注:CRLF是指回车符和行结束符"\r\n"

/**
 * 使用Socket创建一个Htpp客户端
 *
 */
public class SimpleHttpClient {

    public void sendReuqest(){
        Socket socket = null;
        try {
            //连接HTTP服务器
            socket = new Socket("127.0.0.1", 8088);
            //拼接HTTP请求协议规格
            StringBuffer sb = new StringBuffer(
                    "GET"+"/index.jsp"+"HTTP/1.1\r\n");
            sb.append("Host:127.0.0.1\r\n");
            sb.append("Accept:*/*\r\n");
            sb.append("Accept-Language:zh-cn\r\n");
            sb.append("Accept-Encoding:gzip,deflate\r\n");
            sb.append("User-Agent:Mozila/4.0("
                    + "compatible;MSIE 6.0;Windows NT 5.0)\r\n");
            sb.append("Contenction:Keep-Alive\r\n\r\n");
            //发送HTTP请求
            OutputStream out = socket.getOutputStream();
            out.write(sb.toString().getBytes());
            socket.shutdownInput();
            
            //接收HTTP响应结果
            InputStream in = socket.getInputStream();
            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
            byte[] buff = new byte[1024];
            int len =-1;
            while((len = in.read(buff)) != -1){
                buffer.write(buff, 0, len);
            }
            System.out.println(new String(buffer.toByteArray()));
        } catch (Exception e) {
            // TODO: handle exception
        }
        
    }
}

-------------
HTTP响应格式
与HTTP请求相似,HTTP响应也由3部分构成,分别是:
1、HTTP协议的版本、状态代码、描述
2、响应头
3、响应正文
如:
HTTP/1.1 200 OK
Server:nio/1.1
Content-Type:text/html;charset=GBK
Content-length:102
<html>
<head>
<title>helloapp</title>
</head>
<body>
<h1>hello</h1>
</body>
</html>
------
1、HTTP协议的版本、状态代码、描述
状态码:是一个3位整数,以1/2/3/4或5开头
1xx:信息提示,表示临时响应。
2xx:响应成功,表名服务器成功地接收了客户端请求
3xx:重定向
4xx:客户端错误,
5xx:服务器错误
2、响应头
响应头也和请求头一样包含许多有用的信息。例如:服务器类型、正文类型、正文长度等:
Server:nio/1.1
Content-Type:text/html;charset=GBK
Content-length:102
3、响应正文:
常见的是HTML网页
注:HTTP请求头与请求正文之间必须用空行分隔,同样,HTTP响应头与响应正文之间也必须空行分隔。

posted on 2019-04-29 22:09  lazyli  阅读(962)  评论(0编辑  收藏  举报