当我的应用程序启动时,它在给定端口上绑定:
public boolean checkIsAlreadyStart() {
try {
final ServerSocket server = new ServerSocket();
server.setReuseAddress(false);
server.bind(new InetSocketAddress("127.0.0.1",APPLICATION_PORT ));
if (server.isBound()){
logger.debug("binding to port: {}", APPLICATION_PORT);
return false;
}
return true;
} catch (IOException e) {
logger.error("cannot bind to port", e);
return true;
}
}
但是,当我同时运行两个Application实例时,第二个实例仍然可以在没有IOException的情况下运行该方法。我必须调用accept()方法吗?
答案 0 :(得分:2)
无法重现:
10/04/2013 3:55:34 PM S checkIsAlreadyStart
INFO: Bound to port: 9,999
10/04/2013 3:55:34 PM S checkIsAlreadyStart
SEVERE: cannot bind to port
java.net.BindException: Address already in use: JVM_Bind
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:383)
at java.net.ServerSocket.bind(ServerSocket.java:328)
at java.net.ServerSocket.bind(ServerSocket.java:286)
at S.checkIsAlreadyStart(S.java:33)
at S.main(S.java:63)
然而,由于server
是一个局部变量,它很可能允许ServerSocket,
的垃圾收集,它将关闭它。如果您打算保持端口打开,则应将server
设为实例变量。
答案 1 :(得分:0)
您确定该应用程序的第一个实例仍在运行吗?您可以在应用程序中放置Thread.sleep,以确保在启动第二个实例时它仍在运行。
我跑了两次,第二次失败,正如你想的那样。
public static void main(String args[]) {
Menu m = new Menu();
m.checkIsAlreadyStart();
try {
Thread.sleep(20000);
} catch (Exception e){}
}