我有一个套接字,并创建了四个流:
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)
答案 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)
您只需要关闭已包装在套接字输出流中的最外层输出流或Writer。这可以确保它被刷新。
关闭任何流或套接字会关闭其他流。
EOFException是正常。这意味着您已到达流的末尾。