1. 我正在编写一个基于 TCP 通信的聊天应用程序。我正在使用 NetBeans,我想在退出 JFrame 时向默认的 EXIT_ON_CLOSE 添加功能。原因当然是因为我想安全地清理资源和结束线程。如何调用清除资源的方法,然后才能安全地关闭 JFrame 并结束进程。
2. 我需要实现服务端。服务器具有“套接字”的列表/哈希映射/队列及其聊天昵称。是否有任何简单的设计模式可以正确地做到这一点,因为我不想重新发明轮子。
谢谢。
1. 我正在编写一个基于 TCP 通信的聊天应用程序。我正在使用 NetBeans,我想在退出 JFrame 时向默认的 EXIT_ON_CLOSE 添加功能。原因当然是因为我想安全地清理资源和结束线程。如何调用清除资源的方法,然后才能安全地关闭 JFrame 并结束进程。
2. 我需要实现服务端。服务器具有“套接字”的列表/哈希映射/队列及其聊天昵称。是否有任何简单的设计模式可以正确地做到这一点,因为我不想重新发明轮子。
谢谢。
在尝试了 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 接口的所有方法的实现(它包括每个方法的空实现,因此您可以覆盖您关心的方法)。
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addWindowListener(new WindowAdapter()
{
@Override
public void windowClosing(WindowEvent we)
{
//Code goes here
}
});
对于第 2 点:当我编写一个类似的程序时,我创建了一个名为“Connection”的类,其中包括一个套接字和一个字符串昵称作为成员。该类扩展了 Thread 类。
因此,无论何时创建一个新的套接字,它都会被插入到这样一个对象中,然后该对象将作为一个单独的线程运行,监听新消息。这些对象在创建时插入到列表中,然后在用户注销时酌情删除。
对于第 1) 点,设置JFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
, 添加 aWindowListener
到框架。在 close 方法中,添加结束Thread
s 和清除资源的功能。
实施Runtime.addShutdownHook(Thread)
. 请注意,关闭挂钩应该很快完成。