1. 程式人生 > >Java使用socket接收http請求,read方法阻塞的問題

Java使用socket接收http請求,read方法阻塞的問題

在socket通訊中,服務端socket往往會使用socket.getInputStream.read()或socket.getInputStream.read(buffer)去讀取客戶端的請求內容,而且僅當read方法返回-1時,服務端socket才認定已經沒有更多的東西可讀了,這個在java doc可以看到

     * @return     the next byte of data, or <code>-1</code> if the end of the
     *             stream is reached.

如果客戶端沒有特殊處理或者不被我們掌控,read是不會返回-1的,如果資料已經讀完,但客戶端如果沒有shutdownOutput的話 服務端的socket就會一直等待,從而導致阻塞。如果作為一個http server 那客戶端的行為是完全不可控的,所以這個時候只能服務端自己來判斷,一字一節去解析收到的資料。所以服務端大致流程如下:

1.解析第一行協議,判斷是GET還是POST請求

2.把http header資訊讀完 如果是POST請求,獲取content length的值

3.如果是post 接著讀完post的內容

4.對其他內容型別的http請求做判斷和處理

具體的程式碼可參考這位仁兄的demo:http://jiangzhengjun.iteye.com/blog/512380