我在Solaris 11.3 SPARC机器上遇到了一个奇怪的问题。我曾经在java中使用以下方法检查端口是否空闲(如果端口是空闲则返回true,否则返回false)。
public static boolean isPortFree(int port) {
try {
new ServerSocket(port).close();
return true;
} catch (IOException e) {
System.out.println("Exception "+e.getMessage());
return false;
}
}
以上代码在除Solaris之外的所有操作系统中都能正常工作。在Solaris机器中,当我使用端口22进行测试时,它正在按预期工作,但是当我使用另一个进程正在使用的端口12345进行测试时,它返回true,这是错误的行为。它应该抛出一个异常,说明Address已经在使用并返回false。请建议我哪个好主意甚至在Solaris中都有用
我认为,您有一个阻止访问端口的活动防火墙。另一方面,检查您的应用程序,天气只启动本地连接
我已经找到了问题,它与Solaris机器中的IPV4和IPV6问题有关。 C进程正在打开IPV4端口,Java的代码片段ServerSocket(port).close();
正在检查IPV6端口。所以这就是原因,即使端口(IPV4)已经在使用,它也不会在Java中引发任何异常。