尝试写入已关闭的连接时,Socket不会抛出异常

Ole*_*nko 6 java sockets

我是java socket编程的新手,但我遇到了问题.
当我尝试写入在客户端意外关闭的连接时,我不会得到任何异常.我有服务器端.

    public static void main(String[] args) throws IOException { 
    ServerSocket socket = new ServerSocket(8036);
    String st;
    while(true) {
        System.out.println("hello");
        Socket socket1 = socket.accept();
        BufferedReader reader = new BufferedReader(new InputStreamReader (socket1.getInputStream()));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket1.getOutputStream()));
        System.out.println(reader.readLine());
        writer.write("h");
        writer.flush();
    }
}
Run Code Online (Sandbox Code Playgroud)

和客户

    public static void main(String[] args) throws  Exception{

    Inet4Address s = (Inet4Address)Inet4Address.getByName("localhost");
    System.out.println("begin");
     Socket socket = new Socket(s,8036);
     BufferedWriter w = new BufferedWriter (new OutputStreamWriter(socket.getOutputStream()));
     BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
     String h ;
     int prev = 0;
}
Run Code Online (Sandbox Code Playgroud)

正如你可以看到客户端在连接后立即退出,我甚__CODE__至在尝试写入套接字时不会在服务器端出现异常.为什么?

use*_*421 7

  1. TCP无法知道收到对端已关闭连接以进行读取的FIN.它只知道对等体已经关闭了写入连接.它可能已关闭输出连接并仍在读取.所以第一次写这样的连接不能是一个错误.

  2. 当您写入TCP连接时,数据将在套接字发送缓冲区中本地缓冲,并将控制权返回给应用程序.写入网络是异步进行的.因此,对同级已经关闭的连接的第一次写入不太可能检测到.随后的写作会.

注意,您的问题是写入已被对等方关闭的连接,而不是写入已关闭的套接字.这会立即给你EBADF.