关闭套接字

时间:2013-12-23 22:38:58

标签: java sockets inputstream outputstream

我有一个套接字,并创建了四个流:

  • InputStream
  • OutputStream
  • ObjectInputStream
  • ObjectOutputStream

关于所有流和套接字,我需要做什么?我以为关闭套接字就足够了,但我一直在EOFExceptions ...

代码越少越好。

有关此问题的更多信息:

我打开一个连接并发送UTF String trought对象流。它的内容启动服务器上的diferenet协议。执行协议时,服务器等待新的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)

2 个答案:

答案 0 :(得分:2)

使用try-with-resources块,这将全部为您处理:

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

退出try块时,您的所有流(以及其他任何实现AutoCloseable的流都将自动关闭。

要在关闭保持流时关闭基础流,它也会关闭较低的流(即关闭ois也会关闭is)但是将它们全部保留在尝试使用资源块。

答案 1 :(得分:1)

  1. 您只需要关闭已包装在套接字输出流中的最外层输出流或Writer。这可以确保它被刷新。

  2. 关闭任何流或套接字会关闭其他流。

  3. EOFException是正常。这意味着您已到达流的末尾。