Chcę uruchomić serwer, który nasłuchuje na porcie. Mogę wyraźnie określić port i działa. Ale chciałbym znaleźć port w sposób automatyczny. W związku z tym mam dwa pytania.
W jakim zakresie numerów portów powinienem szukać? (Użyłem portów 12345, 12346 i 12347 i było dobrze).
Jak mogę się dowiedzieć, czy dany port nie jest zajęty przez inne oprogramowanie?
java
networking
sockets
port
rzymski
źródło
źródło
ssh -D 127.0.0.0:0 ...
? Nie!), Co jest naprawdę frustrujące. Musieliśmy załatać wiele bibliotek / programów, aby były dla nas przydatne.new ServerSocket(0)
nie różni się pod tym względem. W twoim pierwszym linku nie ma nic na ten temat. Twój drugi link pokazuje jedynie złą praktykę. Po zbudowaniuServerSocket
powinieneś go użyć , nie zamykaj go i spróbuj ponownie użyć tego samego numeru portu. Wszystko to jest całkowitą stratą czasu, a także podatnością na problemy z oknem czasowym.Jeśli przekażesz 0 jako numer portu konstruktorowi ServerSocket, alokuje on port dla ciebie.
źródło
Począwszy od wersji Java 1.7 możesz używać try-with-resources w następujący sposób:
Jeśli potrzebujesz znaleźć otwarty port na określonym interfejsie, sprawdź dokumentację ServerSocket dla alternatywnych konstruktorów.
Ostrzeżenie: każdy kod korzystający z numeru portu zwróconego tą metodą podlega warunkom wyścigu - inny proces / wątek może zostać powiązany z tym samym portem natychmiast po zamknięciu instancji ServerSocket.
źródło
SO_REUSEADDR
. I jest warunek wyścigu, ale trudno to naprawić.ServerSocket
z tym samym numerem portu, ponieważ w międzyczasie mógł zostać pobrany. Dlaczego nie chcesz zwrócić rzeczywistegoServerSocket
zamiast go zamknąć, pozostaje tajemnicą.ServerSocket
zamiastint
portu dla portu.Według Wikipedii , należy użyć portów
49152
do65535
jeśli nie potrzebujemy „znanego” port.AFAIK jedynym sposobem ustalenia, czy port jest używany, jest próba jego otwarcia.
źródło
Jeśli potrzebujesz w zasięgu, użyj:
źródło
ServerSockets
w przypadku sukcesu, i nie ma problemów z oknem czasowym tego kodu.Jeśli używasz Springa, możesz spróbować http://docs.spring.io/spring/docs/4.0.5.RELEASE/javadoc-api/org/springframework/util/SocketUtils.html#findAvailableTcpPort--
źródło
SpringUtils.findAvailableTcpPort()
robi dokładnie to samo, co zalecane w innych odpowiedziach: wybierz port, a następnie spróbujnew ServerSocket(port)
.Zestaw Eclipse SDK zawiera klasę SocketUtil , która robi to, co chcesz. Możesz zajrzeć do kodu źródłowego git .
źródło
Zobacz http://java.sun.com/j2se/1.4.2/docs/api/java/net/ServerSocket.html#ServerSocket%28int%29
źródło
Działa to dla mnie w Javie 6
źródło
Niedawno wydałem niewielką bibliotekę, aby robić to właśnie z myślą o testach. Zależność Maven to:
Po zainstalowaniu bezpłatne numery portów można uzyskać poprzez:
źródło
Jeśli serwer się uruchomi, to gniazdo nie zostało użyte.
EDYTOWAĆ
Coś jak:
źródło
new ServerSocket(0)
nie działa dla ciebie alternatywa jest następująca. Wydaje mi się, że istnieje 85% możliwości, z których możesz skorzystać przy mojej sugestii.ServerSockets
zawsze i zachowuje tylko ten ostatni , któremu się udało. Potrzebujebreak
oświadczenia.Jeśli chcesz utworzyć własny serwer za pomocą a
ServerSocket
, możesz po prostu wybrać dla niego wolny port:Inne implementacje serwerów zazwyczaj mają podobne wsparcie. Na przykład Jetty wybiera wolny port, chyba że wyraźnie go ustawisz:
źródło
Może ci to niewiele pomóc, ale na moim komputerze (Ubuntu) mam plik / etc / services, w którym podane są przynajmniej porty używane / zastrzeżone przez niektóre aplikacje. Są to standardowe porty dla tych aplikacji.
Brak gwarancji, że są one uruchomione, tylko domyślne porty, z których korzystają te aplikacje (więc nie należy ich używać, jeśli to możliwe).
Zdefiniowano nieco ponad 500 portów, około połowy UDP i połowy TCP.
Pliki są tworzone przy użyciu informacji IANA, patrz IANA Przypisane numery portów .
źródło
Jeśli używasz Springa, odpowiedź udzielona przez Michaila Nikołajewa jest najprostsza i najczystsza, a IMO powinno zostać ocenione pozytywnie. Dla wygody dodam wbudowany przykład za pomocą metody Springframwework SocketUtils .findAvailableTcpPort () :
int randomAvailablePort = SocketUtils.findAvailableTcpPort();
To takie proste, tylko jedna linia :). Oczywiście klasa Utils oferuje wiele innych interesujących metod, sugeruję zajrzeć do dokumentacji.
źródło
Za pomocą klasy „ServerSocket” możemy ustalić, czy dany port jest używany, czy wolny. ServerSocket udostępnia konstruktor, który przyjmuje liczbę całkowitą (czyli numer portu) jako argument i inicjuje gniazdo serwera na porcie. Jeśli ServerSocket zgłasza wyjątek IO, możemy założyć, że ten port jest już w użyciu.
Poniższy fragment kodu służy do uzyskania wszystkich dostępnych portów.
Link referencyjny .
źródło
jeśli port jest zajęty przez inne oprogramowanie, kod wygeneruje wyjątek IOException
źródło