2014-05-19 48 views
1

我正在用Java編寫服務器 - 客戶端應用程序,並且我希望服務器在客戶端崩潰或意外關閉時向其發送消息。關閉鉤子期間關閉I/O流

Runtime.getRuntime().addShutdownHook(new Thread(){ 
    public void run(){ 
     out.writeObject(new ServerQuit()); 
     out.close(); 
    } 
} 

其中out是用於寫入到客戶端的輸出流,並ServerQuit表示發送在服務器崩潰時該消息。

這是安全嗎? Javadocs說,人們不應該「盲目地依賴可能已經註冊了自己的關閉鉤子的服務,因此可能會自己關閉服務。」由於I/O流在JVM關閉時自動關閉,我的關閉鉤子是否會工作?也就是說,在關閉鉤子運行時,I/O流是否已經關閉?

+0

我很確定在發生崩潰的情況下,服務器只會*停止*。不能真正依靠任何東西來處理崩潰。 idk關於一個關機雖然... – awksp

回答

0

I/O流不要'JVM關閉時自動關閉'。 操作系統關閉了任何文件套接字等,該進程可能已經打開,但這與JVM的任何操作無關。因此,在關閉掛鉤運行時,您的流仍處於打開狀態。

但是你在做什麼是完全沒有必要的。無論如何,客戶端都會收到流式結尾。這就是它所需要的。

+0

所以它是沒有必要發送ServerQuit消息,但一個應該可能關閉插座的權利? – jedyobidan

+0

如果在它下面有一個BufferedOutputStream,你應該關閉ObjectOutputStream來確保刷新。否則,就忘了它。 – EJP

+0

@EJP - 標準輸入流(System.in)如何? 。假設我已經創建了一個指向System.in的掃描器,如果我最終不調用'scanned.close()',會發生什麼? – TheLostMind