在Java中退出JFrame和TCP通信之前关闭资源

时间:2011-04-16 21:41:51

标签: java jframe netbeans-6.9 serversocket

1 我正在编写一个基于聊天的TCP通信应用程序。 我正在使用NetBeans,我想在退出JFrame时向默认的EXIT_ON_CLOSE添加功能。 当然是因为我想安全地清理资源和结束线程。 如何调用清除资源的方法,然后安全关闭JFrame并结束该过程。

2 我需要实现服务器端。服务器具有“Socket”的List / HashMap / Queue及其聊天昵称。是否有任何简单的设计模式才能正确完成,因为我不想重新发明轮子。

感谢。

4 个答案:

答案 0 :(得分:1)

在尝试安德鲁建议尝试自己解决这个问题之后,这就是我所做的。就我而言,我正在关闭tcp通信时将数据保存到数据库。这个想法保持不变:我们在关闭窗口和程序实际关闭之间有工作要做。

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addWindowListener(new WindowListener() {            
    @Override
    public void windowOpened(WindowEvent e) {
        // TODO Load all data here                
    }
    @Override public void windowClosing(WindowEvent e) {
        // TODO Save the data
    }

    @Override public void windowIconified(WindowEvent e) {}            
    @Override public void windowDeiconified(WindowEvent e) {}            
    @Override public void windowDeactivated(WindowEvent e) {}            
    @Override public void windowActivated(WindowEvent e) {}
    @Override public void windowClosed(WindowEvent e) {}
});

答案 1 :(得分:1)

您可以使用WindowAdapter类来保存实现WindowListener接口的所有方法(它包含每个方法的空实现,以便您可以覆盖您关心的方法)。

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addWindowListener(new WindowAdapter()
{
    @Override
    public void windowClosing(WindowEvent we)
    {
        //Code goes here
    }
});

答案 2 :(得分:0)

对于第1点),设置JFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);,在框架中添加WindowListener。在close方法中,添加功能以结束Thread s&清除资源。

实施Runtime.addShutdownHook(Thread)也可能需要付出代价。请注意,关闭挂钩应该很快完成。

答案 3 :(得分:0)

对于第2点:当我编写类似的程序时,我创建了一个名为“Connection”的类,其中包含一个套接字和一个字符串昵称作为成员。该类扩展了Thread类。

因此,每当创建一个新套接字时,它就会被插入到这样一个对象中,然后该对象作为一个单独的线程运行,监听新消息。无论何时创建一个对象,这些对象都会插入到列表中,然后在用户注销时将其删除。