不应该将 SoLinger 设置为错误地切断此连接吗?

Shouldn't set SoLinger to false cut this connection?

据我了解,linger 是一种设置,允许在关闭后保持连接一些延迟,以便有时间读取最终数据。

我有这个例子:

@Ignore
public class SocketTTest
{
    @Test
    public void socketTest() throws Throwable
    {
        new Thread(() -> {
            try
            {
                ServerSocket serverSocket = new ServerSocket(5555);

                while(true)
                {

                    //keep listening
                    Socket socket = serverSocket.accept();
                    socket.setSoLinger(false, 0);

                    InputStream in = socket.getInputStream();

                    System.out.println(in.read());

                    Thread.sleep(2000);

                    System.out.println(in.read());

                    in.close();
                    socket.close();
                    System.exit(0);
                }
            }
            catch(Throwable ex)
            {
                ex.printStackTrace();
            }
        }).start();

        Socket socket = new Socket("localhost", 5555);
        socket.setSoLinger(false, 0);
        OutputStream out = socket.getOutputStream();
        out.write(1);
        out.write(2);
        out.close();
        socket.close();

        synchronized(this)
        {
            wait();
        }
    }
}

和输出

1 
2

2怎么读?延迟被禁用,套接字在从睡眠中苏醒时不应该处于不可读状态?

Shouldn't setSoLinger() to false cut this connection?

没有

From what I understand, linger is a setting allowing to keep the connection some delay after close for the final data to have time to be read.

没有。默认情况下,TCP 已经这样做了。该设置会导致 close() 在仍有未决数据等待发送时阻塞指定的超时时间。设置它没有什么意义,您的代码通过调用 setSoLinger(false, 0) 完成的所有工作就是重新声明默认设置。没有它,无论有没有睡眠,您的代码都可以正常工作。

SO_LINGER 也可以通过重置连接来滥用 TCP/IP,但您不会在这里这样做。

How the 2 is read?

因为 TCP 不会以这种方式丢失数据。

The linger is disabled

是的,但它已经是,见上文。

the socket shouldn't be in an unreadable state when it comes out of sleep?

我不知道这是什么意思。要么你在自相矛盾,要么这里有一个无意的双重否定。