0

私のアプリケーションでは、開始時に特定のポートにバインドします。

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

ただし、アプリケーションの 2 つのインスタンスを同時に実行すると、2 番目のインスタンスは IOException なしでメソッドを実行できます。accept() メソッドを呼び出す必要がありますか?

4

2 に答える 2

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、インスタンス変数を作成する必要があります。

于 2013-04-10T05:57:13.927 に答える
0

アプリケーションの最初のインスタンスがまだ実行されていますか? アプリケーションに Thread.sleep を配置して、2 番目のインスタンスを起動したときにアプリケーションがまだ実行されていることを確認できます。

あなたが意図したように、私はこれを2回実行しましたが、2回目は失敗しました。

    public static void main(String args[]) {
    Menu m = new Menu();
    m.checkIsAlreadyStart();
    try {
    Thread.sleep(20000);
    } catch (Exception e){}
}
于 2013-04-10T02:33:00.363 に答える