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 - Fatal编程技术网

Java 如何确保程序在正常关闭或崩溃时关闭套接字?

Java 如何确保程序在正常关闭或崩溃时关闭套接字?,java,sockets,Java,Sockets,代码如下: public static void main(String[] args) { SocketWorker worker = null; MyIOConsole mio = null; try { portNumber = 2012; worker = new SocketWorker(); worker.assignPort(portNumber); mio = new MyIO

代码如下:

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

}
但是当套接字出现异常时,即使我捕捉到它们,代码

        mio.applicationQuit();

继续跑。我不希望这样,我只希望当用户关闭或崩溃应用程序时,套接字将关闭并退出。如何解决它?

添加以下内容。JVM退出时将调用run方法

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run(){
        // cleanup code before JVM exit goes here.
    }
});

请添加SocketWorker代码以澄清问题