1. 程式人生 > >http Chunked

http Chunked

有的時候伺服器生成HTTP迴應是無法確定資訊大小的,這時用Content-Length就無法事先寫入長度,而需要實時生成訊息長度,這時伺服器一般採用Chunked編碼。

在進行Chunked編碼傳輸時,在回覆訊息的頭部有transfer-coding並定義為Chunked,表示將用Chunked編碼傳輸內容。

在jsmartsales中,在midlet向服務端以POST方式傳送Request時,發現是以Chunked方式編碼的(我的服務端不支援Chunked編碼);

在去掉dos.flush();後,就不是以Chunked方式編碼的了,程式正常,servlet端可以以Request.getParameter()方法取到引數了

為什麼呢?

先看DataOutputStream類的javadoc

flush

public void flush()
           throws IOException
Flushes this data output stream. This forces any buffered output bytes to be written out to the stream.

The flush method of DataOuputStream calls the flush method of its underlying output stream.

一篇csdn上關於flush()方法的討論

flush方法即使在緩衝區中沒有滿的情況下,也會將緩衝區內的內容強制寫到外設,也就是所謂的重新整理。flush方法不是對所有的OutputStream子類起作用,只對那些使用緩衝區的OutputStream子類有效。。。。
呼叫close方法,系統在關閉這個流前,也會將緩衝區的內容寫到外設上。。。。
所以你在程式中要注意對flush的呼叫,不然可能碰到奇怪的問題。。。

dos.flush(); //包含本句,在某些設被上將可能會產生不可預期的結果

呼叫flush ()方法的意圖是傳送已經寫入的資料到DataOutputStream的伺服器的緩衝區中。在某些電話上,這個操作工作正常,在其他的電話上,它導致HTTP請求的Transfer - Encoding被設定為" chunked ",有一些隨機字元被放到請求本身的前面和後面。那又怎樣處理這個問題呢?這個方法呼叫實際上是根本不需要的。在接下來的一行中,伺服器連線開啟(通過openInputStream ()),將自動輸入緩衝區。因此,你最好不要呼叫緩衝區的flush()方法。