最近在搞页面一键操作自动化运维的事情,简单来说,就是把需要手工改配置,再通过shell启动节点的事情,全部通过代码和脚本串联起来。
本来有一步操作是手工配置端口,但自动化之后需要程序找到未被占用端口,并写入配置文件
思路:配置文件处有默认端口,一般来说用户使用时会参考默认端口依次递增,所以我这里找可用端口的思路也是会根据默认端口依次递增去递归找到未被占用端口
直接上代码
package test; import java.io.IOException; import java.net.*; import java.util.Enumeration; public class GetLocalHost { public static void main(String[] args) throws Exception { int inputPort = 8400; System.out.println("输入端口:" + inputPort + ", 递增递归找到可用端口为:" + getUsablePort(inputPort)); } /** * 根据输入端口号,递增递归查询可使用端口 * @param port 端口号 * @return 如果被占用,递归;否则返回可使用port */ public static int getUsablePort(int port) throws IOException { boolean flag = false; Socket socket = null; InetAddress theAddress = InetAddress.getByName("127.0.0.1"); try{ socket = new Socket(theAddress, port); flag = true; } catch (IOException e) { //如果测试端口号没有被占用,那么会抛出异常,通过下文flag来返回可用端口 } finally { if(socket!=null) { //new了socket最好释放 socket.close(); } } if (flag) { //端口被占用,port + 1递归 port = port + 1; return getUsablePort(port); } else { //可用端口 return port; } } }
运行结果
与实际相符