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

标签 java sockets serversocket so-linger

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

最佳答案

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) 完成的所有操作都是重新声明默认设置。没有它,无论有没有 sleep ,您的代码都可以正常工作。

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?

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

关于java - 不应该将 SoLinger 设置为错误地切断此连接吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51576299/

相关文章:

c++ - 可以 boost ssl 半关闭套接字吗?

java - 使用套接字同时发送多种类型

java - 如何从java中的哈希列表中检索值

java - 当使用 Endpoint 类发布 Web Service 时,WSDL 在哪里创建?

java - java.util.Date 是否将日期表示为系统日期?

java - RMI 请求是在服务器端按进程或线程处理的吗?

java - 如何在java中将接收到的字节显示为文本?

c - 不接收数据的阻塞recv() (TCP)

java - objectInputStream.readObject() 抛出异常 java.io.OptionalDataException

java - 关于Java ServerSocket接受: busy-wating?