Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关闭输出流时Java套接字的行为_Java_Sockets - Fatal编程技术网

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

关闭输出流时Java套接字的行为,java,sockets,Java,Sockets,有人能解释一下Java套接字中的以下行为吗: 总体思路是: 打开套接字,获取I/O流 写请求,关闭流 读取响应,在流中关闭 合上插座 这是我的问题 如果我使用PrintWriter进行输出,然后关闭它,它将关闭整个套接字,随后的读取操作将失败 相反,如果我直接使用套接字的shutdownOutput()方法,它会正确地关闭输出流通道,同时保持套接字活动 为什么关闭PrintWriter对象会使整个套接字随之关闭?这可能是因为调用PrintWriter的close()方法可以追溯到整个层次结构,也

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

总体思路是:

  • 打开套接字,获取I/O流
  • 写请求,关闭流
  • 读取响应,在流中关闭
  • 合上插座
  • 这是我的问题

    如果我使用
    PrintWriter
    进行输出,然后关闭它,它将关闭整个套接字,随后的读取操作将失败

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


    为什么关闭
    PrintWriter
    对象会使整个套接字随之关闭?

    这可能是因为调用
    PrintWriter
    close()
    方法可以追溯到整个层次结构,也可以调用
    socketoutput流的
    close()
    方法。作为
    SocketOutputStream
    close()
    方法的一部分,它还调用
    Socket
    close()
    方法,这也将关闭
    SocketOutputStream
    。调用
    shutdownOutput()
    函数将发送之前写入的所有数据,然后发送TCP的正常连接终止序列。然后它将禁用输出流。

    这可能是您的代码的样子:

    Socket socket;
    PrintWriter pw = new PrintWriter(socket.getOutputStream());
    pw.close();
    
    现在,让我们看一下Socket的
    getOutputStream()
    方法的描述

    getOutputStream

    public OutputStream getOutputStream()抛出IOException

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

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

    返回:

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

    抛出:

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

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


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

    可能需要在关闭之前刷新它。在关闭PrintWriter之前,您是否尝试在连接上刷新.flush(),以查看问题是否没有发生?RTFM eh:)我想这就彻底解释了。谢谢血狼@我想知道如何避免这种情况。如果我想在关闭OutputStream后保持套接字打开,该怎么办。有什么方法可以做到这一点吗?我仍然没有找到
    为什么
    的答案。“为什么关闭PrintWriter对象会使整个套接字随之关闭?”