2013-12-23 220 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