HTTP與TCP的關系
阿新 • • 發佈:2018-04-29
bbb 什麽 img 關閉 html 如果 web amp sem
一直比較想寫TCP與HTTP之間的關系,HTTP報文是如何通過tcp發送的,HTTP報文形式內容如何。
HTTP請求包含請求行,請求頭,請求體
HTTP響應包含響應頭,響應頭,響應體
下面我準備通過JAVA自帶的socket創建一個HTTP服務,這樣就可以直到HTTP整個內容了。
public static void main(String[] args) throws Exception { ServerSocket ss = null; Socket socket = null; BufferedReader br = null; BufferedWriter bwView Code= null; try { //1.創建socket連接 ss = new ServerSocket(8081); //循環等待 while (true) { //2.堵塞,直到有新的連接進來 socket = ss.accept(); //3.設置讀寫緩沖區 br = new BufferedReader(new InputStreamReader(socket.getInputStream())); bw= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); String s; int contentLength = 0; //4.輸出請求體中的內容,並且將Content-Length的值賦值給contentLength,確定post請求體的大小 while ((s = br.readLine()) != null && !s.isEmpty()) { System.out.println(s);if (s.indexOf("Content-Length") != -1) { contentLength = Integer.parseInt(s.substring(s.indexOf("Content-Length") + 16)); } } //5.如果有請求體,通過read方法讀取請求體中的內容 if (contentLength != 0) { char[] buf = null; if (contentLength != 0) { buf = new char[contentLength]; br.read(buf, 0, contentLength); System.out.println("The data user posted: " + new String(buf)); } } //6 設置響應體內容 bw.write("HTTP/1.1 200 OK\n"); bw.write("Content-Type: text/html; charset=UTF-8\n\n"); bw.write("<html>\n" + "<head>\n" + " <title>first page</title>\n" + "</head>\n" + "<body>\n" + " <h1>Hello World!" + "</h1>\n" + "</body>\n" + "</html>\n"); //7.沖刷到瀏覽器,即使關閉資源,不然可能導致瀏覽器一直等待服務器數據 bw.flush(); bw.close(); br.close(); socket.close(); } } catch (IOException e) { e.printStackTrace(); } finally { //關閉資源 ss.close(); } }
首先我在瀏覽器中輸入http://localhost:8081/?username=tt 網址(使用不同的瀏覽器請求報文可能有些差異,比如你安裝的某些插件
導致插件也會向服務器發出請求),下面來看看這個在服務器接收到的是什麽內容
//首先是請求行,包含請求方式,相對路徑,HTTP協議,占一行(也就是說後面接上了\n) GET /?username=tt HTTP/1.1 //之後就是請求體,主要包括Accept,Accept-Language,User-Agent,Accept-Encoding,Host,Connection,每一個都獨占一行 Accept: text/html, application/xhtml+xml, image/jxr, */* Accept-Language: zh-CN User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299 Accept-Encoding: gzip, deflate Host: localhost:8081 Connection: Keep-Alive //由於GET沒有請求體,所以不會出現請求體內容,如果是post請求則會有請求體內容View Code
之後再來看看響應體寫法
//1.設置響應體 包含HTTP協議版本,狀態碼, 狀態碼說明 bw.write("HTTP/1.1 200 OK\n"); //2.設置響應頭,主要是相應提編碼以及MIME類型方便瀏覽器解析 bw.write("Content-Type: text/html; charset=UTF-8\n\n"); //3.設置響應體,與HTML類似 bw.write("<html>\n" + "<head>\n" + " <title>first page</title>\n" + "</head>\n" + "<body>\n" + " <h1>Hello World!"+"</h1>\n" + "</body>\n" + "</html>\n");View Code
HTTP與TCP的關系