1. 程式人生 > >Socket程式設計中的inputstream阻塞問題

Socket程式設計中的inputstream阻塞問題

今天在使用socket程式設計時,想把從客戶端獲取的資料轉換成String物件。使用了程式碼

// 將流物件轉成String物件
String data = org.apache.commons.io.IOUtils.toString(socket.getInputStream());

發現執行程式碼時阻塞在這裡了。難道是工具類Bug?追蹤了一下程式碼發現執行到

// 執行程式碼input.read(buffer) 發生阻塞
while (EOF != (n = input.read(buffer))) {
     output.write(buffer, 0, n);
     count += n;
}
百度了一下最終發現了問題導致原因:

read方法執行時如果遇到檔案末尾會返回-1。而socket通訊時,服務端會一直等待客戶端輸入。

所以預設情況下客戶端傳送完了資料之後是不會通知服務端資料傳送完畢。

當我們在編寫客戶端程式碼時,需要手動呼叫socket物件的shutdownOutput()方法。來通知服務端資料傳送完畢。

該方法的目的是告訴服務端客戶端的輸入結束了。但是並不關閉服務端與客戶端的通訊連線。