1 20 package org.apache.mina.util; 21 22 import java.io.IOException ; 23 import java.net.DatagramSocket ; 24 import java.net.ServerSocket ; 25 import java.util.NoSuchElementException ; 26 import java.util.Set ; 27 import java.util.TreeSet ; 28 29 36 public class AvailablePortFinder { 37 40 public static final int MIN_PORT_NUMBER = 1; 41 42 45 public static final int MAX_PORT_NUMBER = 49151; 46 47 50 private AvailablePortFinder() { 51 } 52 53 60 public static Set <Integer > getAvailablePorts() { 61 return getAvailablePorts(MIN_PORT_NUMBER, MAX_PORT_NUMBER); 62 } 63 64 69 public static int getNextAvailable() { 70 return getNextAvailable(MIN_PORT_NUMBER); 71 } 72 73 79 public static int getNextAvailable(int fromPort) { 80 if ((fromPort < MIN_PORT_NUMBER) || (fromPort > MAX_PORT_NUMBER)) { 81 throw new IllegalArgumentException ("Invalid start port: " 82 + fromPort); 83 } 84 85 for (int i = fromPort; i <= MAX_PORT_NUMBER; i++) { 86 if (available(i)) { 87 return i; 88 } 89 } 90 91 throw new NoSuchElementException ("Could not find an available port " 92 + "above " + fromPort); 93 } 94 95 100 public static boolean available(int port) { 101 if ((port < MIN_PORT_NUMBER) || (port > MAX_PORT_NUMBER)) { 102 throw new IllegalArgumentException ("Invalid start port: " + port); 103 } 104 105 ServerSocket ss = null; 106 DatagramSocket ds = null; 107 try { 108 ss = new ServerSocket (port); 109 ss.setReuseAddress(true); 110 ds = new DatagramSocket (port); 111 ds.setReuseAddress(true); 112 return true; 113 } catch (IOException e) { 114 } finally { 115 if (ds != null) { 116 ds.close(); 117 } 118 119 if (ss != null) { 120 try { 121 ss.close(); 122 } catch (IOException e) { 123 124 } 125 } 126 } 127 128 return false; 129 } 130 131 139 public static Set <Integer > getAvailablePorts(int fromPort, int toPort) { 140 if ((fromPort < MIN_PORT_NUMBER) || (toPort > MAX_PORT_NUMBER) 141 || (fromPort > toPort)) { 142 throw new IllegalArgumentException ("Invalid port range: " 143 + fromPort + " ~ " + toPort); 144 } 145 146 Set <Integer > result = new TreeSet <Integer >(); 147 148 for (int i = fromPort; i <= toPort; i++) { 149 ServerSocket s = null; 150 151 try { 152 s = new ServerSocket (i); 153 result.add(new Integer (i)); 154 } catch (IOException e) { 155 } finally { 156 if (s != null) { 157 try { 158 s.close(); 159 } catch (IOException e) { 160 161 } 162 } 163 } 164 } 165 166 return result; 167 } 168 } 169 | Popular Tags |