Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java套接字绑定两次,无一例外_Java_Sockets_Networking - Fatal编程技术网

Java套接字绑定两次,无一例外

Java套接字绑定两次,无一例外,java,sockets,networking,Java,Sockets,Networking,当我的应用程序启动时,它将绑定到给定的端口: public boolean checkIsAlreadyStart() { try { final ServerSocket server = new ServerSocket(); server.setReuseAddress(false); server.bind(new InetSocketAddress("127.0.0.1",APPLICATION_PORT ));

当我的应用程序启动时,它将绑定到给定的端口:

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;
    }
}

但是,当我同时运行应用程序的两个实例时,第二个实例仍然可以在没有IOException的情况下运行该方法。我必须调用accept()方法吗

您确定应用程序的第一个实例仍在运行吗?您可以在应用程序中放置Thread.sleep,以确保在启动第二个实例时它仍在运行

我运行了两次,第二次失败了,正如你所希望的

    public static void main(String args[]) {
    Menu m = new Menu();
    m.checkIsAlreadyStart();
    try {
    Thread.sleep(20000);
    } catch (Exception e){}
}
无法复制:

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
设置为实例变量