Как я могу гарантировать, что моя программа закрывает сокет всякий раз, когда он закрывается нормально или происходит сбой? - PullRequest
0 голосов
/ 12 марта 2012

Вот код:

public static void main(String[] args) {
    SocketWorker worker = null;
    MyIOConsole  mio = null;

    try {
        portNumber = 2012;

        worker = new SocketWorker();    
        worker.assignPort(portNumber);

        mio = new MyIOConsole();
        mio.assignObject(worker);

        Thread b = new Thread(mio); 
        b.start();

        worker.run();

    } catch (IOException e) {
        e.printStackTrace();
    }finally{
        mio.applicationQuit();
    }
}

SocketWorker - это просто сокет, прослушивающий порт 2012, и MyIOConsole примет пользовательскую команду

public class MyConsoleIO implements Runnable {

    SocketWorker o;
    static BufferedReader reader;

    public void assignObject(Object o) {

        reader = new BufferedReader(new InputStreamReader(System.in));

        this.o = (SocketWorker) o;

    }

    @Override
    public void run() {
        String inputString = null;

        System.out.println("Press 'q' to kill to program");
        try {
            inputString = reader.readLine();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        if (inputString.equalsIgnoreCase("q")) {
            this.applicationQuit();
        }
    }

    public void applicationQuit(){
        this.o.stopWorking();
        System.exit(0);
    }

}

Но когда Socket получил исключение, даже я их ловлю, код

        mio.applicationQuit();

продолжай бежать. Я не хочу этого, я просто хочу, чтобы, когда пользователь закрывал или сбивал приложение, сокет закрывался и выходил. Как я могу решить это?

1 Ответ

2 голосов
/ 12 марта 2012

Добавьте следующее.Метод run будет вызываться при выходе из JVM.

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run(){
        // cleanup code before JVM exit goes here.
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...