A. 一次完整的HTTP請求與響應涉及了哪些知識
域名解析 --> 發起TCP的3次握手 --> 建立TCP連接後發起http請求 --> 伺服器響應http請求,瀏覽器得到html代碼 --> 瀏覽器解析html代碼,並請求html代碼中的資源(如js、css、圖片等) --> 瀏覽器對頁面進行渲染呈現給用戶
B. 如何定位Web應用響應慢原因
運用聽雲Server解決Web應用過程響應慢,並且定位到具體代碼,我們首先登陸聽雲Server控制台,點擊需要查看的應用,進入Web應用過程模塊。(聽雲Server中Web應用過程指:應用程序中處理一次獨立的Web訪問請求的過程,完整的web應用過程是從應用程序收到請求到響應的整個過程)
Web應用過程功能模塊是將當前應用以Web應用過程的維度來展示詳細的應用性能數據,包括以下幾個功能:
「Web應用過程一覽」列出當前應用所有的Web應用過程,並且可以按照耗時百分比、響應時間、吞吐率、Apdex、錯誤率進行排序。
「TOP5最耗時Web應用過程堆疊圖」展示了耗時百分比最大的前5個Web應用過程其牆鍾時間比在選定時間內的變化趨勢。(牆鍾時間比指的是Web應用過程在圖表橫坐標粒時間度下的總耗時時間/圖表橫坐標粒度時間)
「Web應用過程響應時間與吞吐率圖」展示了應用的平均響應時間和每分鍾請求次數在選定時間內的變化趨勢。當請求的響應時間大於設定的閾值時會被顯示在慢應用追蹤列表中。(可在設置中對Web過程跟蹤閾值進行設定,例如設置為500毫秒,那麼所有響應時間大於500毫秒的請求都會被顯示在慢應用過程追蹤列表中,具體值根據自己的需求設置即可)
對於Web應用過程響應慢,我們選擇按照「響應時間」進行排序,響應時間由長到短排列,選擇時間較長的優先進行解決。
點擊該Web應用過程進行數據鑽取,查看其詳細的性能分解。可以看到Web應用過程性能分解堆疊圖,顯示了這個Web應用過程中各個組件在選定時間內的平均響應時間的變化趨勢。
「性能分解表格」展示了其中各個組件的詳細性能信息,包括的信息有代碼段、性能分類、耗時百分比、調用次數、平均響應時間,排列順序是按照平均響應時間由長到短進行排序的。
「響應時間和吞吐率圖」展示了該Web應用過程在選定時間內平均響應時間和每分鍾請求次數的變化趨勢。
「慢應用追蹤列表」顯示了該應用下響應時間大於設定閾值的請求,同樣還是按照響應時間由長到短進行排序。
點擊其中響應時間較長的請求進行慢應用追蹤,跳轉至應用過程慢追蹤頁面。
摘要中可以看到各個組件的響應耗時百分比圖,下面還列出了各個最慢組件詳細的調用次數、持續時間、響應耗時佔比數據。
接下來重點查看追蹤詳情,可以看到各個代碼段的持續時間、時間佔比和時間偏移量,其中持續時間長時間佔比高的就是響應時間長的代碼段,則需要對該代碼段進行重點的優化和修改,從而解決Web應用過程響應慢的問題。
後面的相關SQL展示了其中的SQL操作以及其調用次數和總耗時。
拓補圖展示了相關的調用關系方便更加全面的分析問題,特別說明的是只有發生跨應用調用的應用過程慢追蹤才會展示拓補圖。
C. 實驗四,web伺服器套接字編程怎麼做
1.TCP流式套接字的編程步驟
在使用之前須鏈接庫函數:工程->設置->Link->輸入ws2_32.lib,OK!
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//創建套接字(socket)。
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//轉換Unsigned short為網路位元組序的格式
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
客戶端代碼如下:
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );載入套接字型檔
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup()( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);創建套接字(socket)。
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));向伺服器發出連接請求(connect)。
char recvBuf[100];和伺服器端進行通信(send/recv)。
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
send(sockClient,"This is lisi",strlen("This is lisi")+1,0);
closesocket(sockClient);關閉套接字。
WSACleanup()();//必須調用這個函數清除參數
}
D. HTTP中的請求與響應
我們日常與互聯網通信時是有一系列流程的。我們的電腦發出請求,伺服器端會回復我們需要的信息。這些流程是可以通過可視化的程友洞扮序顯示。下面就介紹一下。
HTTP 的作用就是指導瀏覽器和伺服器如何進行溝通。
-請求命令
-請求的格式
1所在行為第一部分,一下以此類推。一共有四部分。
-注意:
1.請求最多包含四部分,最少包含三部分。(也就是說第四部分可以為空)
2.第三部分永遠都是一個回車(\n)
3.動詞有 GET POST PUT PATCH DELETE HEAD OPTIONS 等
4.這里的路徑包括「查詢參數」,但不包括「錨點」
5.如果你沒有寫路徑,那麼路徑默認為 /
6.第 2 部分中的 Content-Type 標注了第 4 部分的格式
1.打開 Network
2.地址欄輸入網址
3.在 Network 點擊,查看 request,點擊「view source」
4.點擊「view source」
5.可以看到請求的前三部分,如果有請求的第四部分,那麼在 FormData 或 Payload 裡面可以看到
請求過後一般都能有相應。
-注意好灶:
1.GET 請求和 POST 請求對應的響應可以一樣,也可以不一樣
2.響應的第四部分可以很長很長
-響應的格式
-注意:
1.狀態碼需要記,是伺服器對瀏覽器說的話
2.狀態解釋沒什麼用
3.第 2 部分中的 Content-Type 標注了第 4 部分的格式
4.第 2 部分中的 Content-Type 遵循 MIME 規范
1.打顫鬧開 Network
2.地址欄輸入網址
3.選中第一個響應
4.查看 Response Headers,點擊「view source」
5.你會看到響應的前兩部分
6.查看 Response 或者 Preview,你會看到響應的第 4 部分
E. 如何使用Servlet處理客戶端的請求及響應
如何使用Servlet從客戶端獲取請求信息:
首先,讓我們先來看一個請求的實例:
GET/default.asp?username=zhangsan HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/png, */* Accept-Language: en Connection: Keep-Alive Host: ww w.n eusoft.ed u.c n
User-Agent: Mozilla/4.04 [en] (WinNT; I Nav)
Cookie:SITESERVER=ID=8dac8e0455f4890da220ada8b76f; ASPSESSIONIDGGQGGGAF=JLKHAEICGAHEPPMJKMLDEM Accept-Charset: iso-8859-1,*,utf-8
從以上請求信息中,我們可以看出請求信息大致可以分成這樣幾類:
第一類協議相關的信息,如使用的請求方法、請求使用的協議以及請求的資源地址等信息 第二類是請求頭信息,如Accept以及Accept-language等等頭部信息 第三類信息是用戶組織的數據如username=zhangsan等信息 因此從伺服器的角度必須能夠獲取以上信息,也就是通過請求對象對應的方法要能夠獲取響應的請求信息
第一類請求方法,獲取協議相關的信息的方法: getProtocal():獲取協議名稱以及版本信息 getMethod();獲取Http請求所使用的方法 getRequestURI()獲取請求的URI getRequestURL()獲取請求的URL
下面我們看一個獲取協議信息的示例: package neusoft;
import java.io.IOException; import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /**
* Servlet implementation class RequestServlet */
@WebServlet("/r1")
public class RequestServlet extends HttpServlet { private static final long serialVersionUID = 1L; /**
* @see HttpServlet#HttpServlet() */ public RequestServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.print("<html>"); out.print("<head>"); out.print("</head>"); out.print("<body>"); out.print("請求使用的協議為:" + request.getProtocol() + "<br>"); out.print("請求提交數據所使用的方法為:" + request.getMethod() + "<br>"); out.print("請求的URI為:" + request.getRequestURI() + "<br>"); out.print("請求的URL為:" + request.getRequestURL() + "<br>"); out.print("</body>"); out.print("</html>"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response);// TODO Auto-generated method stub } }
第二類獲取請求頭信息相關的方法:
getHeader(String headerName)獲取指定的頭部信息,返回字元串類型 getDateHeader(String headerName)獲取指定的頭部信息,返回日期類型 getIntHeader獲取指定的頭部信息,返回整數類型
getHeaders獲取指定的頭部信息,返回字元串數組類型 getDateHeaders獲取指定的頭部信息,返回字日期數組類型 getIntHeaders獲取指定的頭部信息,返回字整數數組類型 getHeaderNames()獲取客戶端傳遞過來所有頭部的名稱 Http1.1協議中定義的頭部信息如下:
通用頭部信息(即請求和響應均可以使用的頭部信息) general-header = Cache-Control
| Connection | Date | Pragma | Trailer | Transfer-Encoding | Upgrade | Via | Warning 除此之外還有請求專用的請求頭:
request-header = Accept
| Accept-Charset | Accept-Encoding | Accept-Language | Authorization | Expect | From | Host | If-Match | If-Modified-Since | If-None-Match | If-Range | If-Unmodified-Since | Max-Forwards | Proxy-Authorization | Range
| Referer | TE | User-Agent
例如我們想判斷用戶瀏覽器的類型以及所使用的地區語言可以使用如下語句: package neusoft;
import java.io.IOException; import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /**
* Servlet implementation class RequestServlet2 */
@WebServlet("/r2")
public class RequestServlet2 extends HttpServlet { private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet() */
public RequestServlet2() { super();
// TODO Auto-generated constructor stub }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.print("<html>"); out.print("<head>"); out.print("</head>"); out.print("<body>"); out.print("您使用的瀏覽器信息為:" + request.getHeader("User-Agent")+ "<br>"); out.print("您使用的地區語言為" + request.getHeader("Accept-Language") + "<br>"); out.print("</body>"); out.print("</html>");
} /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response);// TODO Auto-generated method stub }
F. javaweb項目部署到雲伺服器上,伺服器不響應請求,一直是404錯誤,但我在本地是一切正常啊,請問大神why
訪問Tomcat出現404錯誤解析:
1。頁面不存在時(針對於樓主問題,排除此項)
2。啟動tomcat時出現錯誤,檢查錯誤日誌(日誌位置Tomcat根目錄/logs/catalina.out),找到錯誤原因,解決錯誤。
G. javaweb如何實現請求和響應
先來看一個流程圖:
伺服器處理請求的流程:
(1)伺服器每次收到請求時,都會為這個請求開辟一個新的線程。
(2)伺服器會把客戶端的請求數據封裝到request對象中,request就是請求數據的載體!
(3)伺服器還會創建response對象,這個對象與客戶端連接在一起,它可以用來向客戶端發送響應。
由流程圖可以看出,在JavaWeb的請求與響應中,最重要的兩個參數為request以及response,這兩參數在Servlet的service( )方法中。
1、response概念:
response是Servlet.service方法的一個參數,類型為javax.servlet.http.HttpServletResponse。在客戶端發出每個請求時,伺服器都會創建一個response對象,並傳入給Servlet.service()方法。response對象是用來對客戶端進行響應的,這說明在service()方法中使用response對象可以完成對客戶端的響應工作。
response對象的功能分為以下四種:
(1)設置響應頭信息
(2)發送狀態碼
(3)設置響應正文
(4)重定向
2、response響應正文
response是響應對象,向客戶端輸出響應正文(響應體)可以使用response的響應流,repsonse一共提供了兩個響應流對象:
(1)PrintWriter out = response.getWriter():獲取字元流;
(2)ServletOutputStream out = response.getOutputStream():獲取位元組流;
當然,如果響應正文內容為字元,那麼使用response.getWriter(),如果響應內容是位元組,例如下載時,那麼可以使用response.getOutputStream()。
注意,在一個請求中,不能同時使用這兩個流!也就是說,要麼你使用repsonse.getWriter(),要麼使用response.getOutputStream(),但不能同時使用這兩個流。不然會拋出illegalStateException異常。
H. http請求和響應
當瀏覽器向Web伺服器發出請求時,它向伺服器傳遞了一個數據塊,也就是請求信息,HTTP請求信息由3部分組成:
l 請求方法URI協議/版本
l 請求頭(Request Header)
l 請求正文
下面是一個HTTP請求的例子:
GET/sample.jspHTTP/1.1
Accept:image/gif.image/jpeg,*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)
Accept-Encoding:gzip,deflate
username=jinqiao&password=1234
(1)請求方法URI協議/版本
請求的第一行是「方法URL議/版本」:GET/sample.jsp HTTP/1.1
以上代碼中「GET」代表請求方法,「/sample.jsp」表示URI,「HTTP/1.1代表協議和協議的版本。
根據HTTP標准,HTTP請求可以使用多種請求方法。例如:HTTP1.1目前支持7種請求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。
GET 請求獲取由Request-URI所標識的資源。
POST 在Request-URI所標識的資源後附加新的數據。
HEAD 請求獲取由Request-URI所標識的資源的響應消息報頭。
OPTIONS 請求查詢伺服器的性能,或查詢與資源相關的選項和需求。
PUT 請求伺服器存儲一個資源,並用Request-URI作為其標識。
DELETE 請求伺服器刪除由Request-URI所標識的資源。
TRACE 請求伺服器回送收到的請求信息,主要用語測試或診斷。
在Internet應用中,最常用的方法是GET和POST。
URI完整地指定了要訪問的網路資源,通常只要給出相對於伺服器的根目錄的相對目錄即可,因此總是以「/」開頭,最後,協議版本聲明了通信過程中使用HTTP的版本。
I. WEB請求處理之瀏覽器響應
當我們使用瀏覽器進行瀏覽操作的時候,會產生一系列的數據請求。現在瀏覽器和伺服器之間的數據交互是基於B/S架構的,而這種架構是建立在HTTP請求的基礎上的,當我們在瀏覽器的地址欄中輸入一個網頁的地址後,會觸發一些列事件,如下圖所示:
以上就是我們訪問網頁時會觸發的一系列事件,也是web請求處理的基本流程,接下來對幾個概念詳細介紹.
TCP協議是OSI七層協議中傳輸層的一項協議,它是一種面向連接的可靠交付的數據傳輸協議,和UDP用戶數據報協議不同的是,它需要建立連接,並且需要無差錯和可靠地交付數據。通過TCP建立連接,需要經過三次握手,關閉TCP連接需要四次揮手。
OSI七層模型中TCP處於的層級位置如圖所示
TCP建立連接是為了可靠地傳輸數據,因此建立過程比較復雜,以確保可靠地傳輸數據。具體流程如下圖所示:
TCP四次揮手
當數據傳輸成功後需要關閉連接,這就是TCP四次揮手。四次揮手比握手還要復雜,具體流程如下圖所示:
在這個過程中,為什麼會涉及到四次揮手呢,這是因為在客戶端發送主動關閉連接請求時,伺服器端收到關閉請求並返回確認收到請求報文,但是伺服器不會立即關閉,因為在這個時間段內可能還會有數據傳送,伺服器端會繼續傳送數據給客戶端,當沒有數據傳送時,伺服器端會主動發送報文給客戶端請求關閉,等待客戶端返回確認時伺服器端就進入了close狀態。
從上面的OSI七層模型中我們可以看到HTTP處於七層協議中的應用層,也就是最接近用戶的一層。它主要是處理WEB數據請求,它是無狀態無連接的協議。無狀態是指上一次傳送的數據是沒有存儲下來的,下一次操作獲取不到上次的數據。無連接是指需要請求數據時才會建立連接,否則處於無連接狀態。在WtEB請求處理過程中,我們主要是關心HTTP請求頭和響應頭還有就是狀態碼.
下面是使用FIDDLER抓包工具抓取的請求包
CONNECT www..com:443 HTTP/1.1
Host: www..com:443
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36
人們習慣記憶域名,但機器間互相只認IP地址,域名與IP地址之間是多對多的關系,一個ip地址不一定只對應一個域名,且一個域名可以對應多個ip地址,它們之間的轉換工作稱為域名解析,域名解析需要由專門的域名解析伺服器來完成,整個過程是自動進行的。
由於DNS域名解析有些復雜,本文章就不就過多的講解。
總結:以上就是web請求處理中瀏覽器響應的相關知識,由於涉及到的 知識太多因此沒喲很詳細的將解,只將解了部分的重要內容,待到以後學習加深,進一步完善。