Как я могу сделать закрытие сокета немедленно, минуя период ожидания? - PullRequest
6 голосов
/ 03 февраля 2010

В Java, когда вы закрываете сокет, он больше ничего не делает, но фактически закрывает TCP-соединение после истечения времени ожидания.

Мне нужно использовать тысячи сокетов, и я хочу, чтобы они закрывались сразу после их закрытия, а не после периода ожидания, который тратит мое время и ресурсы. Что я могу сделать?

Ответы [ 4 ]

6 голосов
/ 03 февраля 2010

Я обнаружил, что с помощью socket.setReuseAddress(boolean) вы можете указать JVM повторно использовать порт, даже если он находится в периоде ожидания.

4 голосов
/ 12 октября 2011

Возможно, вы видите сокеты в состоянии TIME_WAIT. Это нормальное состояние входа сокета на стороне соединения, которое выполняет «активное закрытие». TIME_WAIT существует по очень веской причине, поэтому вы должны быть осторожны с простым повторным использованием адресов.

Я писал о TIME_WAIT, почему он существует и что вы можете с этим сделать при написании серверов здесь в моем блоге: http://www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-design-implications-for-protocols-and-scalable-servers.html

Таким образом, если возможно, измените протокол так, чтобы ваши клиенты вводили TIME_WAIT.

3 голосов
/ 03 февраля 2010

Если вы используете сервер, то ServerSocket - правильное решение. Он будет управлять всем лучше, чем вы, делая это вручную, используя утилизацию и множество других оптимизаций, предназначенных для запуска сервера с Java.

Закрытие сокета отключает объект Java от операционной системы, что означает, что он не занимает никаких ресурсов вне JVM, поэтому это действительно не должно быть проблемой. Но если минимальные накладные расходы от схемы сборки / завершения сборки Java слишком велики, то Java не является правильным решением (поскольку ваша проблема больше не относится к программированию сокетов). Хотя я должен сказать, что эффективный сборщик мусора не намного хуже, чем явное управление памятью (и на самом деле может работать лучше).

1 голос
/ 15 февраля 2010

'Я хочу, чтобы они были закрыты именно после того, как закрыли их, а не потратили впустую мое время и мои ресурсы!' Нет, ты не Вы хотите, чтобы TCP / IP работал правильно, и состояние TIME_WAIT является критически важной частью этого. Если вас беспокоит состояние TIME_WAIT, быстрый ответ - это тот, кто получает FIN, а не тот, кто первым отправляет его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...