1. 我正在写一个基于聊天的TCP通信应用程序。 我正在使用NetBeans,并且我想在退出JFrame时将功能添加到默认EXIT_ON_CLOSE。 当然是因为我想清理资源并安全地结束线程。 如何调用清除资源的方法,然后才能安全关闭JFrame并结束该过程。在Java中退出JFrame和TCP通信之前关闭资源
2. 我需要实现服务器端。服务器具有带有聊天昵称的'Socket'的List/HashMap/Queue。是否有任何简单的设计模式可以正确执行,因为我不想重新发明车轮。
谢谢。
1. 我正在写一个基于聊天的TCP通信应用程序。 我正在使用NetBeans,并且我想在退出JFrame时将功能添加到默认EXIT_ON_CLOSE。 当然是因为我想清理资源并安全地结束线程。 如何调用清除资源的方法,然后才能安全关闭JFrame并结束该过程。在Java中退出JFrame和TCP通信之前关闭资源
2. 我需要实现服务器端。服务器具有带有聊天昵称的'Socket'的List/HashMap/Queue。是否有任何简单的设计模式可以正确执行,因为我不想重新发明车轮。
谢谢。
对于点1),设置JFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
,将一个WindowListener
添加到框架。在关闭方法中,添加功能以结束清除资源的Thread
s &。
它也可能支付实施Runtime.addShutdownHook(Thread)
。请注意,关闭挂钩应该很快完成。
对于第2点:当我编写了一个类似的程序时,我创建了一个名为“Connection”的类,它包含一个套接字和一个字符串昵称作为成员。该类扩展了Thread类。
因此,无论何时创建一个新的套接字,它都会被插入这样一个对象,然后它将作为一个单独的线程运行,侦听新的消息。无论何时创建这些对象,都会将这些对象插入到列表中,然后在用户签出时将其删除。
在尝试解决这个问题后,我试图安德鲁的建议后,这就是我所做的。在我的情况下,我正在关闭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的接口(它包括一个空实现各种方法的,所以你可以重写你关心的)的所有方法。
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addWindowListener(new WindowAdapter()
{
@Override
public void windowClosing(WindowEvent we)
{
//Code goes here
}
});
当这样做时,似乎我的窗户从不关闭。我该如何去结束线程并清除窗口监听器的close方法中的资源(如果它甚至属于它的话)? – corsiKa 2012-03-20 17:02:01
我建议你问一个新问题,显示所用代码的[SSCCE](http://sscce.org/)。 – 2012-03-20 18:01:25
是的,我听到那些奇迹般地治好了一切。我会接受的。 – corsiKa 2012-03-20 19:04:08