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

在退出Java中的JFrame和TCP通信之前关闭资源,java,jframe,netbeans-6.9,serversocket,Java,Jframe,Netbeans 6.9,Serversocket,1. 我正在编写一个基于TCP通信的聊天应用程序。 我使用的是NetBeans,我想在退出JFrame时为默认的EXIT_ON_CLOSE添加功能。 当然,原因是我想安全地清理资源和结束线程。 我如何调用一个方法来清除资源,然后才安全地关闭JFrame并结束进程 2. 我需要实现服务器端。服务器具有“Socket”列表/HashMap/队列及其聊天昵称。因为我不想重新发明轮子,所以有没有简单的设计模式可以正确地实现它 谢谢。对于第1点),设置JFrame.setDefaultCloseOpera

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

2. 我需要实现服务器端。服务器具有“Socket”列表/HashMap/队列及其聊天昵称。因为我不想重新发明轮子,所以有没有简单的设计模式可以正确地实现它

谢谢。

对于第1点),设置
JFrame.setDefaultCloseOperation(JFrame.DO\u NOTHING\u ON\u CLOSE),将
窗口侦听器添加到框架中。在close方法中,添加功能以结束
线程
s&清除资源


实现
Runtime.addShutdownHook(Thread)
可能也会有好处。请注意,关闭钩子应该很快完成。

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


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

在尝试了Andrew的建议,尝试自己解决这个问题之后,我做了以下几点。在我的例子中,我正在将数据保存到数据库中,而您正在关闭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) {}
});

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


这样做的时候,我的窗户似乎永远不会关上。我该如何结束线程并清除窗口侦听器的close方法中的资源(如果该方法属于它的话)?我建议你问一个新问题,展示所用代码的一部分。是的,我听说它们神奇地解决了所有问题。“神奇地治愈一切”它还没有确保世界和平或结束饥饿,但接近治愈癌症
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addWindowListener(new WindowAdapter()
{
    @Override
    public void windowClosing(WindowEvent we)
    {
        //Code goes here
    }
});