首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java ServerSocket 關閉機制:Socket 與 ServerSocket 關閉差異與客戶端感知行為

     編輯:Java 相關知識

前言

資料交換完成後,正確關閉連接至關重要。本文實測驗證關閉 Socket 與 ServerSocket 的差異,揭示客戶端感知狀態(isConnected、isClosed、read() 回傳值)與例外拋出時機。

實驗程式碼

// 伺服器:接受連接後立即關閉 Socket
ServerSocket serverSocket = new ServerSocket(1234);
while (true) {
    Socket socket = serverSocket.accept();
    socket.close();
}

// 客戶端:連接後睡 1 秒再讀取
Socket socket = new Socket("127.0.0.1", 1234);
Thread.sleep(1000);
System.out.println("read() = " + socket.getInputStream().read()); // -1
System.out.println("isConnected() = " + socket.isConnected()); // true
System.out.println("isClosed() = " + socket.isClosed());       // false

關鍵發現

  1. 伺服器關閉 Socket 後,客戶端 read() 回傳 -1(非阻塞),但 isConnected()=true、isClosed()=false —— 客戶端不會立即感知連接關閉。
  2. 若客戶端嘗試 write(),將拋出 SocketException。
  3. 伺服器關閉 ServerSocket(而非 Socket),客戶端 read() 拋出 SocketException: Connection reset。

ServerSocket 狀態判斷

if (serverSocket.isBound() && !serverSocket.isClosed())
    System.out.println("活動狀態");
else
    System.out.println("非活動狀態");

註:close() 不會改變 isBound()(仍為 true),類似 Socket.isConnected() 行為。

結語

關閉 Socket 只是結束雙向資料流,連接物件狀態標記不變;關閉 ServerSocket 才真正釋放端口。開發者應依業務需求決定關閉層級,並正確解讀 read()=-1 與例外的語意差異。

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