【问题标题】:Does closing the inputstream of a socket also close the socket connection?关闭套接字的输入流是否也会关闭套接字连接?
【发布时间】:2011-04-26 18:00:39
【问题描述】:

在 Java API 中,

Socket socket = serverSocket.accept(); BufferedReader fromSocket = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter toSocket = new PrintWriter(socket.getOutputStream()); //do sth with fromSocket ... and close it fromSocket.close(); //then write to socket again toSocket.print("is socket connection still available?\r\n"); //close socket socket.close();

在上面的代码中,在我关闭了来自Socket的InputStream之后,似乎socket连接不可用了——客户端不会收到“is socket connection仍然可用”的消息。 这是否意味着关闭套接字的输入流也会关闭套接字本身?

【问题讨论】:

  • 不,它不会在服务器端抛出任何异常。似乎 toSocket 输出流 obj 在服务器端仍然有效,但在客户端连接已关闭。

标签: java api sockets


【解决方案1】:

是的,关闭输入流会关闭套接字。你需要在socket上使用shutdownInput方法,到close just the input stream:

//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(); 

【讨论】:

  • 不,它会单向关闭,关闭套接字的输入部分(这样您就无法接收更多数据),但仍然让您在输出部分发送消息,我认为就是你要问的。当您最终在套接字上调用 close() 时,输出端也会关闭。
  • 是的,关闭输入流会关闭套接字。同上输出流。所以当然你应该关闭的是输出流,所以它会被刷新。
  • 我正在寻找一种在不关闭套接字的情况下关闭 OutputStream 的方法,它成功了!非常感谢队友!你结束了一个没完没了的任务……
  • 我正在寻找相同的@Gregordy,但寻找的是BluetoothSocket。它没有方法shutdownInput()。你有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多