我尝试使用以下方法检查端口80是否可用:
Sockets: Discover port availability using Java
我有一个Java应用程序,用于检查端口80是否可用,如果是,它运行一个小型Web服务器侦听端口80.它可以很好地检测另一个Java应用程序是否侦听端口80,例如如果我运行我的应用程序两次,第二个实例将正确告诉我端口80正在使用。
问题是我让WAMP在端口80上运行和监听,如果我在启动WAMP后运行我的Java应用程序,它就不会告诉我端口80正忙。它似乎只告诉我另一个Java应用程序是否使用端口80。
这超出了我的理解......非常感谢任何帮助!
代码段:
int port = 80;
if(!Connection.isPortAvailable(port)) {
logger.info("Port " + port + " is already in use");
}
// in Connection class
public static boolean isPortAvailable(int port) {
ServerSocket ss = null;
DatagramSocket ds = null;
try {
ss = new ServerSocket(port);
ss.setReuseAddress(true);
ds = new DatagramSocket(port);
ds.setReuseAddress(true);
return true;
} catch (IOException e) {
} finally {
if (ds != null) {
ds.close();
}
if (ss != null) {
try {
ss.close();
} catch (IOException e) {
/* should not be thrown */
}
}
}
return false;
}
答案 0 :(得分:2)
对这种性质的所有问题的正确答案是尝试使用它并捕获异常。不要试着看它是否可用然后尝试使用它仍然必须处理异常,这有几个明显的问题:
这适用于'it'的大多数值,包括网络端口,文件,任何资源。
答案 1 :(得分:1)
我能够通过运行WampServer(验证它是通过访问localhost:80运行)并在给定示例代码的情况下运行最小的java程序来重现您的问题。
当WampServer运行时,try块中的代码没有抛出异常。但是,像这样修改try块的前几行
ss = new ServerSocket();
ss.bind(new InetSocketAddress("127.0.0.1", port));
和isPortAvailable
将正确检测WampServer何时运行以及何时不运行。使用"0.0.0.0"
代替"127.0.0.1"
不能与WampServer一起使用,但是在IIS运行时正确检测到了。您可以通过关闭第一个套接字来检查两者
ss = new ServerSocket();
ss.bind(new InetSocketAddress("0.0.0.0", port));
ss.close();
ss = new ServerSocket();
ss.bind(new InetSocketAddress("127.0.0.1", port));