1. 程式人生 > >HTTP協議規定,客戶端的編寫

HTTP協議規定,客戶端的編寫

name zip 基礎上 ive 分隔 pre ringbuf use append

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響應頭與響應正文之間也必須空行分隔。

HTTP協議規定,客戶端的編寫