1

据我了解, 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怎么读?逗留被禁用,从睡眠中醒来时套接字不应该处于不可读状态?

4

1 回答 1

3

不应该setSoLinger()切断false这种联系吗?

不。

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

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

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

2怎么读?

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

徘徊者被禁用

没错,但它已经是,见上文。

当它从睡眠中出来时,套接字不应该处于不可读的状态吗?

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

于 2018-07-29T01:31:22.550 回答