关闭Socket的输入流是否也会关闭Socket连接?

31

在Java API中,


Socket socket = serverSocket.accept();
BufferedReader fromSocket = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter toSocket = new PrintWriter(socket.getOutputStream());
// 对从套接字读取的内容进行处理...然后关闭它
fromSocket.close();
// 然后再次向套接字写入内容
toSocket.print("套接字连接是否仍然可用?\r\n");
// 关闭套接字
socket.close();

在上述代码中,当我关闭了来自Socket的InputStream后,似乎socket连接不再可用 - 客户端将无法收到“ socket连接是否仍然可用”的消息。 这是否意味着关闭Socket的输入流也会关闭Socket本身?

不,它在服务器端没有抛出任何异常。似乎toSocket输出流对象仍然在服务器端工作,但在客户端,连接已关闭。 - dolaameng
1个回答

43

是的,关闭输入流会关闭套接字。您需要在套接字上使用shutdownInput方法,以仅关闭输入流

//do sth with fromSocket ... and close it 
socket.shutdownInput(); 

然后,你仍然可以发送到输出套接字。
//then write to socket again 
toSocket.print("is socket connection still available?\r\n"); 
//close socket 
socket.close(); 

3
不,它执行的是单向关闭,关闭套接字的输入端(这样你就无法再接收更多的数据),但仍然可以让你在输出端发送消息,我想这正是你所询问的。当你最终调用close()关闭套接字时,输出端也会被关闭。 - Michael Goldshteyn
1
是的,关闭输入流也会关闭套接字。输出流也是如此。因此,您应该关闭的始终是输出流,以便它被刷新。 - user207421
我一直在寻找一种关闭OutputStream而不关闭socket的方法,它解决了我的问题!非常感谢伙计!你结束了一个漫长的搜索... - Gregordy
我正在寻找与@Gregordy相同的内容,但是针对BluetoothSocket。它没有shutdownInput()方法。你有任何想法吗? - Jaydip Kalkani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接