Eu quero iniciar um servidor que ouça uma porta. Eu posso especificar a porta explicitamente e funciona. Mas eu gostaria de encontrar uma porta de maneira automática. A este respeito, tenho duas perguntas.
Em qual intervalo de números de porta devo procurar? (Eu usei as portas 12345, 12346 e 12347 e estava tudo bem).
Como posso descobrir se uma determinada porta não está ocupada por outro software?
java
networking
sockets
port
romano
fonte
fonte
ssh -D 127.0.0.0:0 ...
? Não!), O que é realmente frustrante. Tivemos que corrigir várias bibliotecas / programas para usá-los.new ServerSocket(0)
não é diferente a esse respeito. Não há nada no seu primeiro link sobre isso. Seu segundo link apenas exibe más práticas. Depois de construí-ServerSocket
lo, use -o, não feche -o e tente reutilizar o mesmo número de porta. Tudo isso é uma completa perda de tempo, além de estar vulnerável a problemas na janela de tempo.Se você passar 0 como o número da porta para o construtor do ServerSocket, ele alocará uma porta para você.
fonte
A partir do Java 1.7, você pode usar try-with-resources como este:
Se você precisar encontrar uma porta aberta em uma interface específica, verifique a documentação do ServerSocket para construtores alternativos.
Aviso: Qualquer código que utilize o número da porta retornado por este método está sujeito a uma condição de corrida - um processo / encadeamento diferente pode ser vinculado à mesma porta imediatamente após o fechamento da instância ServerSocket.
fonte
SO_REUSEADDR
. E há uma condição de corrida, mas é difícil consertar isso.ServerSocket
com o mesmo número de porta, pois pode ter sido obtido enquanto isso. Por que você não apenas devolve o real emServerSocket
vez de fechá-lo permanece um mistério.ServerSocket
vez de umint
para a porta.Segundo a Wikipedia , você deve usar portas
49152
para65535
se você não precisa de uma porta 'bem conhecida'.No AFAIK, a única maneira de determinar se uma porta está em uso é tentar abri-la.
fonte
Se você precisar no intervalo, use:
fonte
ServerSockets
no caso de sucesso, e não sofre com os problemas da janela de tempo desse código.Se você usa o Spring, tente http://docs.spring.io/spring/docs/4.0.5.RELEASE/javadoc-api/org/springframework/util/SocketUtils.html#findAvailableTcpPort--
fonte
SpringUtils.findAvailableTcpPort()
está fazendo exatamente o mesmo recomendado em outras respostas: escolha uma porta e tentenew ServerSocket(port)
.O SDK do Eclipse contém uma classe SocketUtil , que faz o que você deseja. Você pode dar uma olhada no código fonte do git .
fonte
Consulte http://java.sun.com/j2se/1.4.2/docs/api/java/net/ServerSocket.html#ServerSocket%28int%29
fonte
Isso funciona para mim no Java 6
fonte
Recentemente, lançou uma pequena biblioteca para fazer exatamente isso com testes em mente. A dependência do Maven é:
Uma vez instalado, é possível obter números de porta gratuitos através de:
fonte
Se o servidor iniciar, esse soquete não foi usado.
EDITAR
Algo como:
fonte
new ServerSocket(0)
não está funcionando para o seu, a alternativa é esta. Eu acho que há 85% de possibilidades que você acaba usando minha sugestão.ServerSockets
para sempre e mantém apenas o último que foi bem-sucedido. Precisa de umabreak
declaração.Se você deseja criar seu próprio servidor usando a
ServerSocket
, basta escolher uma porta gratuita para você:Outras implementações de servidor geralmente têm suporte semelhante. O Jetty, por exemplo, escolhe uma porta livre, a menos que você a defina explicitamente:
fonte
Pode não ajudar muito, mas na minha máquina (Ubuntu) eu tenho um arquivo / etc / services no qual pelo menos as portas usadas / reservadas por alguns dos aplicativos são fornecidas. Essas são as portas padrão para esses aplicativos.
Não há garantias de que eles estejam em execução, apenas as portas padrão que esses aplicativos usam (portanto, você não deve usá-los, se possível).
Existem pouco mais de 500 portas definidas, cerca de metade UDP e metade TCP.
Os arquivos são criados usando as informações da IANA. Consulte Números de porta atribuídos pela IANA .
fonte
Se você estiver usando o Spring, a resposta fornecida por Michail Nikolaev é a mais simples e mais limpa, e a IMO deve ser votada. Apenas para fins de conveniência, adicionarei um exemplo embutido usando o método Springframwework SocketUtils .findAvailableTcpPort () :
int randomAvailablePort = SocketUtils.findAvailableTcpPort();
É tão fácil quanto isso, apenas uma linha :). Obviamente, a classe Utils oferece muitos outros métodos interessantes, sugiro dar uma olhada nos documentos.
fonte
Usando a classe 'ServerSocket', podemos identificar se determinada porta está em uso ou livre. ServerSocket fornece um construtor que usa um número inteiro (que é o número da porta) como argumento e inicializa o soquete do servidor na porta. Se o ServerSocket lançar qualquer exceção de E / S, podemos assumir que essa porta já está em uso.
O fragmento a seguir é usado para obter todas as portas disponíveis.
Link de referência .
fonte
se a porta estiver ocupada por outro software, o código emitirá uma IOException
fonte