Не следует ли установить SoLinger на ложное отключение этого соединения?

Из того, что я понимаю, 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 ответ

Решение

не должны setSoLinger() в false обрезать это соединение?

Нет.

Из того, что я понимаю, linger - это настройка, позволяющая удерживать соединение после некоторой задержки после закрытия, чтобы окончательные данные успели прочитать.

Нет. TCP уже делает это по умолчанию. Это параметр, который вызывает close() заблокировать на указанное время ожидания, пока еще ожидают отправки данных. Нет смысла его устанавливать, и все, что ваш код выполнил, вызвав setSoLinger(false, 0) чтобы восстановить настройки по умолчанию. Ваш код будет одинаково хорошо работать без него, а также с или без снов.

SO_LINGER также может использоваться для злоупотребления TCP/IP путем сброса соединения, но здесь вы этого не делаете.

Как 2 читается?

Потому что TCP не теряет данные таким образом.

Задержка отключена

Правда, но это уже было, см. Выше.

сокет не должен быть в нечитаемом состоянии, когда он выходит из сна?

Я не знаю, что это значит. Либо вы противоречите себе, либо здесь есть непреднамеренный двойной негатив.

Другие вопросы по тегам