Java - Как закрыть сброс сокета, который был инициализирован моим приложением, и на лету снова открыть его? оба в TCP или UDP - PullRequest
0 голосов
/ 09 марта 2012

У меня есть следующее приложение, которое запускается, как показано ниже:

Runtime.getRuntime().exec("java -cp /var/dist/Test.jar System.V PDP-11");

Имеет от 10 до 20 секунд задачи и содержит TCP / UDP-сервер на порту 1965. Как только эта задача будет выполнена, моя другая рука отправляет байт TCP для выключения системы. V

Runtime.getRuntime().exec("java -cp /var/dist/Test.jar System.V PDP-11/20");

В течение менее 1 секунды выполняется другое действие, как указано выше, но оно не выполняется, поскольку порт 1965 уже используется. Но он был убит с помощью System.exit(0)

Как мне решить это? Так что там не написано "уже используется порт"? Похоже, что для деинициализации портов TCP или UDP, которые прослушивались через Java, требуется много времени. (где порт nc -l убивается намного быстрее).

Продолжение:

Я попытался выполнить следующие действия, но все еще требуется слишком много времени, чтобы получить доступ к этому порту (ОС Linux).

байт [] buf = новый байт [50];

* * Sock.setSoTimeout тысячи двадцать-одина (100); * * тысяча двадцать-две

1 Ответ

1 голос
/ 09 марта 2012

ОС требуется некоторое время, чтобы «заметить», что порт можно использовать снова - даже если вы закроете сокет и закроете приложение. Проблема может быть решена с помощью следующего кода:

ServerSocket ss = ... //initialization of socket listening on port 1965
ss.setReuseSocket(true);

Пожалуйста, помните, что приведенный выше код является лишь подсказкой для ОС, которая должна освободить порт как можно быстрее. Некоторые экзотические реализации стека TCP могут не соответствовать этому.

...