典型代碼以下: 前端
OutputStream os = response.getOutputStream(); os.write("Hello world !".getBytes()); os.flush(); os.close();
大部分人都知道flush會把緩衝區的內容輸出到前端。其實,servlet容器對會flush做了一些特殊的處理。這就跟http協議提及,通常http通訊時會使用Content-Length頭信息來表示服務器發送的文檔內容長度,這是由於咱們已經提早知道了文檔內容的長度,但有時候沒法提早知道須要傳輸的文檔的長度,這時就要採用分塊傳輸的方式來發送內容,也就是經過咱們的http trunked協議 ,即在http header 中設置Transfer-Encoding:chunked 。 java
而servlet容器又是怎樣判斷使用Content-Length仍是Transfer-Encoding:chunked。Content-Length 和 Transfer-Encoding:chunked是不會在header中同時存在的。若是servlet中沒有調用flush方法,serlvet容器會優先使用Content-Length;要是強硬調用flush,servlet容器沒法肯定輸出內容的的長度,所以會使用Transfer-Encoding:chunked。可是servlet中設定了Content-Length,servlet容器無論是否有調用flush,只使用Content-Length;同理,servlet中設定了Transfer-Encoding:chunked,只使用Transfer-Encoding:chunked方式;
服務器