@@ -36,27 +36,45 @@ public WebServer(StatsManager statsManager, Logger logger, Settings settings) {
3636 : null ;
3737 }
3838
39- public void start (int port ) {
40- try {
41- server = HttpServer .create (new InetSocketAddress (settings .bindAddress (), port ), 0 );
42-
43- server .createContext ("/moss/players/" , this ::handlePlayerByUUID );
44- server .createContext ("/moss/players" , this ::handleAllPlayers );
45- server .createContext ("/moss/player/" , this ::handlePlayerByName );
46- server .createContext ("/moss/online" , this ::handleOnline );
47- server .createContext ("/moss/summary" , this ::handleSummary );
48- server .createContext ("/moss/top/" , this ::handleTop );
49- server .createContext ("/moss/health" , this ::handleHealth );
50-
51- server .setExecutor (Executors .newFixedThreadPool (4 , r -> {
52- Thread t = new Thread (r , "PlayerStatsAPI-http" );
53- t .setDaemon (true );
54- return t ;
55- }));
56- server .start ();
57- } catch (IOException e ) {
58- logger .log (Level .SEVERE , "Не удалось запустить Web-сервер." , e );
39+ /**
40+ * Attempts to bind on {@code port}. If that port is busy and
41+ * {@code fallbackPorts} are provided, tries each in order.
42+ *
43+ * @return the port actually bound, or -1 if every candidate failed
44+ */
45+ public int start (int port , int ... fallbackPorts ) {
46+ int [] candidates = new int [1 + fallbackPorts .length ];
47+ candidates [0 ] = port ;
48+ System .arraycopy (fallbackPorts , 0 , candidates , 1 , fallbackPorts .length );
49+
50+ for (int candidate : candidates ) {
51+ try {
52+ server = HttpServer .create (new InetSocketAddress (settings .bindAddress (), candidate ), 0 );
53+
54+ server .createContext ("/moss/players/" , this ::handlePlayerByUUID );
55+ server .createContext ("/moss/players" , this ::handleAllPlayers );
56+ server .createContext ("/moss/player/" , this ::handlePlayerByName );
57+ server .createContext ("/moss/online" , this ::handleOnline );
58+ server .createContext ("/moss/summary" , this ::handleSummary );
59+ server .createContext ("/moss/top/" , this ::handleTop );
60+ server .createContext ("/moss/health" , this ::handleHealth );
61+
62+ server .setExecutor (Executors .newFixedThreadPool (4 , r -> {
63+ Thread t = new Thread (r , "PlayerStatsAPI-http" );
64+ t .setDaemon (true );
65+ return t ;
66+ }));
67+ server .start ();
68+ return candidate ;
69+ } catch (java .net .BindException e ) {
70+ logger .warning ("Порт " + candidate + " занят, пробую следующий..." );
71+ server = null ;
72+ } catch (IOException e ) {
73+ logger .log (Level .SEVERE , "Не удалось запустить Web-сервер на порту " + candidate + "." , e );
74+ server = null ;
75+ }
5976 }
77+ return -1 ;
6078 }
6179
6280 public void stop () {
0 commit comments