2013-12-23 218 views
1

我有一個插槽和四流創造出來的:關閉套接字

  • InputStream
  • OutputStream
  • ObjectInputStream
  • ObjectOutputStream

什麼我需要做的關閉與插座一起的所有流?我認爲關閉插座就足夠了,但我已經得到EOFExceptions ...

代碼越少越好。

更多關於這個問題:

我打開一個連接併發送UTF串trought對象流。它的內容在服務器上啓動了不同的協議。當協議執行時,服務器等待一個新的UTF字符串。

在一個點上,客戶端執行:

objectOutputStream.writeUTF("terminate"); 
objectOutputStream.flush(); //Is this even necessary? 
socket.close(); 

在服務器端,這樣的事情發生了:

String command = objectInputStream.readUTF(); 
if (command.equals("terminate") 
{ 
    socket.close(); 
} 

//socket is not accessed after this point, until a new conenction is established 
//(when socket and everything is reinitialized) 
+1

關閉套接字之後除了例外之外,您還期待什麼? – bmargulies

+0

當你關閉套接字時,你也關閉了/從這些套接字的流。如果您嘗試在閉合的流(關閉的套接字)上執行操作,則應該獲得異常和/或EOF。 –

+0

如果你用'BufferedOutputStream'包裝它,你可以跳過'.flush()'。而且,由於您正在爲您的流使用「Decorator」模式,因此您可以關閉最外層。 –

回答

2

使用try-與資源塊,這將全部用於處理你:

try (InputStream is = new InputStream(socket); 
    OutputStream os = new OutputStream(socket); 
    ObjectInputStream ois = new ObjectInputStream(is) 
    ObjectOutputStream oos = new ObjectInputStream(os)) { 
    // Do stuff here 
} 

你所有的數據流(和其他任何實現AutoCloseable將AUTOMATICA當你退出try塊時,你將被關閉。

若要在封閉保持流時,關閉低輩關閉底層流(即關閉ois也將關閉is),但也沒有壞處,讓他們都在嘗試,用資源塊。

+0

所以我應該關閉這兩個對象流和套接字本身?或者只是對象流? – Karlovsky120

+0

如果有疑問關閉它們(套接字也是'AutoCloseable')。但真正的問題是爲什麼在關閉套接字後你仍然試圖讀/寫流...因爲這不起作用:) –

1
  1. 你只需要關閉自己的套接字輸出流纏外側輸出流或作家。這確保了它被刷新。

  2. 關閉任何流或套接字關閉其他。

  3. EOFException是正常。這意味着你已經到達流的末尾。

+0

因此,每次關閉套接字時都會拋出EOFException?試圖從封閉的套接字/流中讀取時不行? – Karlovsky120

+0

如果對除readLine()之外的任何其他X調用readXXX(),則會引發EOFException;而readLine()會返回null; read()返回-1。當* peer *關閉連接時,而不是當* *關閉* socket時。* – EJP