Запуск программы по одному порту - PullRequest
0 голосов
/ 24 мая 2011

Я использую Java-код на CentOS 5

java Something.java &

, который создает сокет на определенном порту .... скажем 9090 .. однако код не запускается полностью, и поэтому я Ctrl-C из него.

Когда я пытаюсь запустить программу снова, она выдает ошибку, говоря, что не может подключиться к порту 9090.

Когда я меняю номер порта на какую-то произвольную вещь, такую ​​как 9010 ... все снова работает (за исключением того факта, что Something.java застревает) .... взбейте и повторите

Что происходит? Я хотел бы иметь возможность использовать один последовательный порт для этого материала ... есть ли какой-то фоновый процесс, от которого я не избавляюсь каждый раз?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 24 мая 2011

Это может произойти, потому что ОС имеет некоторую задержку на карантин до тех пор, пока другой процесс не сможет повторно использовать адрес.

В библиотеке C предусмотрена опция сокета SO_REUSEADDR, которую можно установить, чтобы избежать этого.Быстрый веб-поиск показывает, что setReuseAddress(boolean) in java.net.ServerSocket может использоваться для установки этой опции.

0 голосов
/ 24 мая 2011

Для JVM может потребоваться некоторое время, чтобы фактически завершить программу и освободить сокет.

Вы можете вручную закрыть сокет, когда программа завершается с помощью ctrl-c с помощью Runtime.getRuntime().addShutdownHook(...), что я настоятельно рекомендую для всего программного обеспечения, которое работает в фоновом режиме и использует сокеты. Должно помочь.

...