BufferedOutputStream.close()会让BufferedInputStream关闭吗?

时间:2017-10-13 11:33:07

标签: java android sockets

这是我第一次使用socket程序。
我的要求是android客户端提出问题并通过socket从ubuntu服务器接收答案。
在我的客户端,我从套接字创建了BufferedInputStream和BufferedInputStream。

Socket client = new Socket();
InetSocketAddress isa = new InetSocketAddress(my_host, 8888);
client.connect(isa, 10000);
inputStream = new BufferedInputStream(client.getInputStream());
outputStream = new BufferedOutputStream(client.getOutputStream());

我遇到了一个奇怪的行为:当我的客户端通过outputStream发送请求并调用它的close()时,调用inputStream.read()将得到 java.net.SocketException:Socket已关闭 错误。但是我的client.isConnected()仍然返回true。

try {
  outputStream.write("who_are_you".getBytes());
  outputStream.flush();
  outputStream.close();  // inputStream will be invalid if I call this line.

  Log.i(TAG, "client: " + client.isConnected());  // client still return true
  byte[] b = new byte[1024];
  String data = "";
  int length;
  // I will receive java.net.SocketException: Socket is closed as I call below code
  while ((length = inputStream.read(b)) > 0)  // If length <= 0, it means exit.
  {
    Log.i(TAG, "receive message, length: " + length);
    data += new String(b, 0, length);
    Log.i(TAG, "receive message: " + data);
  }
} catch (java.io.IOException e) {
  Log.w(TAG, "socket connection fail");
  e.printStackTrace();
}

我知道如果我不调用outputStream.close(),我可以避免这种情况。但我非常好奇为什么会这样?这是正常结果吗?

1 个答案:

答案 0 :(得分:1)

关闭套接字输入流或输出流将在套接字本身上调用close。因此,除非要关闭连接,否则无需关闭它们。

关于您的支票,请参阅Socket#isConnected()方法(https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#isConnected())上的javadoc

  

public boolean isConnected()

     

返回套接字的连接状态。

     

注意:关闭套接字不会清除其连接状态,这意味着如果在关闭套接字成功连接之前,此方法将对已关闭的套接字返回true(请参阅isClosed())。