Я хочу запустить сервер, который слушает порт. Я могу указать порт явно, и это работает. Но я бы хотел найти порт автоматически. В связи с этим у меня два вопроса.
В каком диапазоне номеров портов я должен искать? (Я использовал порты 12345, 12346 и 12347, и это было нормально).
Как я могу узнать, не занят ли данный порт другим программным обеспечением?
java
networking
sockets
port
Римский
источник
источник
ssh -D 127.0.0.0:0 ...
Нет!»), Что действительно расстраивает. Нам пришлось исправлять целый ряд библиотек / программ, чтобы сделать их полезными для нас.new ServerSocket(0)
не отличается в этом отношении. В вашей первой ссылке об этом ничего нет. Ваша вторая ссылка просто показывает плохую практику. После того как вы сконструировали,ServerSocket
вы должны использовать его, а не закрывать и пытаться повторно использовать тот же номер порта. Все это пустая трата времени, а также уязвимость к проблемам с временным окном.Если вы передадите 0 в качестве номера порта конструктору ServerSocket, он выделит вам порт.
источник
Начиная с Java 1.7 вы можете использовать try-with-resources, например так:
Если вам нужно найти открытый порт на определенном интерфейсе, проверьте ServerSocket документацию для альтернативных конструкторов.
Предупреждение. Любой код, использующий номер порта, возвращаемый этим методом, подчиняется условию состязания - другой процесс / поток может связываться с одним и тем же портом сразу после закрытия экземпляра ServerSocket.
источник
SO_REUSEADDR
. И есть условие гонки, но это трудно исправить.ServerSocket
с таким же номером порта, как это могло быть сделано в это время. Почему вы не просто вернули фактическое значение,ServerSocket
а не закрыли его, остается загадкой.ServerSocket
вместоint
порта, хотя.Согласно Википедии , вы должны использовать порты
49152
для65535
если не нужен «хорошо известных» порта.AFAIK единственный способ определить, используется ли порт, состоит в том, чтобы попытаться открыть его.
источник
Если вам нужно в диапазоне использования:
источник
ServerSockets
в случае успеха, и не страдает от проблем с временным окном этого кода.Если вы используете Spring, вы можете попробовать http://docs.spring.io/spring/docs/4.0.5.RELEASE/javadoc-api/org/springframework/util/SocketUtils.html#findAvailableTcpPort--
источник
SpringUtils.findAvailableTcpPort()
делается точно так же, как и в других ответах: выберите порт, затем попробуйтеnew ServerSocket(port)
.Eclipse SDK содержит класс SocketUtil , который делает то, что вы хотите. Вы можете заглянуть в исходный код git .
источник
См. Http://java.sun.com/j2se/1.4.2/docs/api/java/net/ServerSocket.html#ServerSocket%28int%29.
источник
Это работает для меня на Java 6
источник
Недавно я выпустил крошечную библиотеку для этого, имея в виду тесты. Maven зависимость это:
После установки номера свободных портов можно получить через:
источник
Если ваш сервер запускается, то этот сокет не использовался.
РЕДАКТИРОВАТЬ
Что-то вроде:
источник
new ServerSocket(0)
не работает для вас альтернатива это. Я думаю, что есть 85% возможностей, которые вы в конечном итоге используете мое предложение.ServerSockets
вечно и сохраняет только последний успешно выполненный код . Это нужноbreak
заявление.Если вы хотите создать свой собственный сервер с помощью
ServerSocket
, вы можете просто выбрать свободный порт для вас:Другие реализации сервера обычно имеют аналогичную поддержку. Например, Jetty выбирает свободный порт, если вы явно не установите его:
источник
Это может вам не сильно помочь, но на моей машине (Ubuntu) у меня есть файл / etc / services, в котором указаны по крайней мере порты, используемые / зарезервированные некоторыми приложениями. Это стандартные порты для этих приложений.
Нет никаких гарантий, что они работают, только порты по умолчанию, которые используют эти приложения (поэтому вы не должны использовать их, если это возможно).
Определено чуть более 500 портов, около половины UDP и половина TCP.
Файлы создаются с использованием информации IANA, см. Назначенные номера портов IANA .
источник
Если вы используете Spring, ответ, предоставленный Михаилом Николаевым, является самым простым и чистым, и IMO следует проголосовать без голосования. Просто для удобства я добавлю встроенный пример с использованием метода Springframwework SocketUtils .findAvailableTcpPort () :
int randomAvailablePort = SocketUtils.findAvailableTcpPort();
Это так просто, всего одна строчка :). Конечно, класс Utils предлагает много других интересных методов, я предлагаю взглянуть на документы.
источник
Используя класс «ServerSocket», мы можем определить, используется ли данный порт или свободен. ServerSocket предоставляет конструктор, который принимает целое число (то есть номер порта) в качестве аргумента и инициализирует сокет сервера на порту. Если ServerSocket генерирует какое-либо исключение ввода-вывода, мы можем предположить, что этот порт уже используется.
Следующий фрагмент используется для получения всех доступных портов.
Ссылочная ссылка .
источник
если порт занят другим программным обеспечением, код выдаст IOException
источник