不应该将SoLinger设置为false切断此连接吗?

时间:2018-07-29 00:33:46

标签: java sockets serversocket so-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?延迟功能已禁用,从睡眠状态退出时套接字不应处于无法读取的状态吗?

1 个答案:

答案 0 :(得分:4)

  

setSoLinger()false不会断开此连接吗?

否。

  

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

不。默认情况下,TCP已经这样做。此设置会导致close()阻塞指定的超时时间,同时仍有待发送的待处理数据。对其进行设置没有任何意义,并且通过调用setSoLinger(false, 0)完成的所有代码就是重新声明默认设置。没有它,有无睡眠都可以使您的代码同样正常工作。

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

  

如何读取2?

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

  

留守被禁用

是的,但确实如此,请参见上文。

  

当套接字退出睡眠状态时,它应该不会处于无法读取的状态吗?

我不知道这意味着什么。您是在矛盾自己,还是在这里无意中出现了双重否定。