首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Socket 對應輸入輸出流:每次 getInputStream() 產生新流物件,非同一實例

     編輯:程式設計綜合問答

程式碼:

Socket socket = server.accept();
DataInputStream input = new DataInputStream(socket.getInputStream());

List list = new ArrayList();
list.add(socket);
Socket socket1 = (Socket) list.get(0);
DataInputStream input1 = new DataInputStream(socket1.getInputStream());

結論:input 與 input1 是**不同**的流物件

  • socket.getInputStream() 每次呼叫都**建立新的 InputStream 實例**(通常是 SocketInputStream)。
  • 雖然兩個流讀取的是**同一個底層 Socket 通道**,但它們是獨立的包裝物件,擁有各自的緩衝區、位置指標、狀態標記。

若需共用同一流

// 方式一:共用變數
DataInputStream shared = new DataInputStream(socket.getInputStream());
// 後續皆用 shared

// 方式二:第二個引用指向第一個
DataInputStream input1 = input; // 同一物件

實務建議

  • **單執行緒讀取**:一個 Socket 同一時間只應有一個執行緒呼叫 read,否則資料會被搶佔導致訊息殘缺。
  • **包裝層統一**:在接受 Socket 後立即建立 BufferedReader/DataInputStream 並傳遞給處理邏輯,避免重複包裝。
  • **關閉策略**:關閉外層包裝流(DataInputStream.close())會連帶關閉底層 Socket,切勿重複關閉。

理解「Socket 通道唯一,流物件可多」有助於正確設計網路讀取架構,避免並發讀取與資源洩漏問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved