当前位置: 首页 > 面试题库 >

关闭输出流时Java套接字的行为

柯新翰
2023-03-14
问题内容

有人可以解释一下Java套接字中的以下行为:

总体思路是这样的:

  1. 打开套接字,获取I / O流。
  2. 写请求,关闭流
  3. 读取响应,关闭流
  4. 关闭插座。

这是我的问题。

如果我将a PrintWriter用于输出,然后将其关闭,则它将关闭整个套接字,并且随后的读取操作将失败。

相反,如果我直接使用套接字的shutdownOutput()方法,它将正确关闭输出流通道,同时使套接字保持活动状态。

为什么关闭PrintWriter对象会使整个插槽都掉下来?


问题答案:

这可能是您的代码如下所示:

Socket socket;
PrintWriter pw = new PrintWriter(socket.getOutputStream());
pw.close();

现在,让我们看一下getOutputStream()Socket方法的描述。

getOutputStream

public OutputStream getOutputStream() throws IOException

返回此套接字的输出流。如果此套接字具有关联的通道,则结果输出流会将其所有操作委托给该通道。如果通道处于非阻塞模式,则输出流的写操作将抛出IllegalBlockingModeException

关闭返回的内容OutputStream将关闭关联的套接字。

返回值:

用于将字节写入此套接字的输出流。

抛出:

IOException-如果在创建输出流时发生I / O错误,或者未连接套接字。

从上面的描述中,我们知道关闭返回的内容OutputStream将关闭关联的套接字。

现在,当您关闭时PrintWriter,它将关闭关联的OutputStream,这将关闭关联的套接字。



 类似资料:
  • 我包一个插座。通过InputStreamReader获取getInputStream(),并包装一个套接字。getOutputStream()由OutputStreamWriter创建。我发现这些流的关闭顺序真的很重要,但我不知道为什么。 如果我先关闭outputStream,然后再关闭inputStream,它可以正常工作: 但是,如果我先关闭inputStream,然后再关闭outputStr

  • 因此,我有一个客户机wich连续发送和接收数据消息,wich工作正常,然而,当我关闭/停止客户机时,我会得到以下单行错误: 尽管我试图关闭插座--最终封闭了。现在我的问题是为什么我会收到这个错误,这个行为是否正常,以及如何正确处理这个错误。下面是我的代码:

  • 我最近一直在玩套接字,但是我遇到了一个问题…当我从服务器接收数据时,我得到一个“java.net.套接字异常:套接字关闭”异常。我没有在任何地方关闭套接字,事实上,我唯一使用关闭()的地方是扫描仪上从System.in读取文本; 以下是我的代码: 客户: 服务器: 数据包发送者: 客户端接收器: 数据包接收器:

  • 我尝试用Java套接字API制作基本的Java聊天应用程序。但是当客户端终止时,它会引发以下异常, socketException:套接字关闭 我认为即使套接字已经关闭,BufferedReader流仍然尝试读取行消息。 但我不知道当客户端终止时,何时以及如何关闭BufferedReader流和套接字连接。 我完全被这部分卡住了。有什么想法吗?

  • JavaSocket API告诉我,关闭一个套接字也会关闭套接字的和。 Socket API Javadoc和Input/OutputStream API info都没有定义(我还没有找到它)对于或来说,“关机”到底意味着什么,但我一直假设关闭会使它们进入“关机”状态。 然而,在我成功调用客户端套接字的方法(调用返回)之后,如果我调用该套接字的或方法,结果是。 我确信在调用套接字的时,两个流都没有

  • 我想创建能够与多个客户端连接的服务器,但我总是收到“套接字关闭”异常或从输入流中读取空值,以前我认为这是由于以错误的方式关闭套接字连接引起的,所以我发布了这个主题,但现在似乎这不是问题所在。 服务器方法 HandlerThread类 客户端模拟器 例外和问题 在客户端模拟器之前启动服务器,客户端模拟器没有任何异常,但是在服务器端,并没有收到所有数据,从控制台打印信息时,我看到“null”、“Hel