有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

首次写入remotelyclosedsocket不会触发异常,对吗?JAVA

我在任何地方都找不到这个问题的满意答案。请了解内部结构的人解释一下好吗

我编写了一个简单的客户机/服务器来演示这个问题服务器读取一行文本,然后关闭socket。客户端写入一行文本,等待10秒,然后再写入两行文本。第二次写入(10秒后)失败,但第一次写入始终成功

为什么BufferedWriter不能在第一次写入时引发异常?毕竟插座在很长一段时间前是常闭的。代码还在第一次写入之前读取socket,返回-1表示输入端已经检测到socket关闭。为什么输出端不能也知道这一点

  public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(9000);
        Socket s = ss.accept();
        BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
        System.out.println(in.readLine());
        s.close();
        System.out.println("Socket closed");
    }
  }

  public class Client {
    public static void main(String[] args) throws IOException, InterruptedException {
        Socket s = new Socket("localhost", 9000);
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        out.write("Hello, World!\n"); out.flush();
        Thread.sleep(10000);
        System.out.println("Read from socket returns: " + s.getInputStream().read());
        out.write("First write\n"); out.flush();
        System.out.println("First write succeeded without detecting socket closed");
        out.write("Second write\n"); out.flush();
        System.out.println("Second write succeeded without detecting socket closed");
    }
  }

共 (1) 个答案

  1. # 1 楼答案

    远程关闭与远程关闭输出无法区分。这一端在这两种情况下都会收到FIN,这意味着对等方已停止发送。没有迹象表明他已经停止接收,即使事实上他已经关机输入。因此,发送方可以检测的唯一方法是在发送时获取RST,根据定义,这不会发生在第一次发送时,除非发送的数据可能大于套接字发送缓冲区