2011-04-16 78 views
1

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

2. 我需要实现服务器端。服务器具有带有聊天昵称的'Socket'的List/HashMap/Queue。是否有任何简单的设计模式可以正确执行,因为我不想重新发明车轮。

谢谢。

回答

0

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

它也可能支付实施Runtime.addShutdownHook(Thread)。请注意,关闭挂钩应该很快完成。

+0

当这样做时,似乎我的窗户从不关闭。我该如何去结束线程并清除窗口监听器的close方法中的资源(如果它甚至属于它的话)? – corsiKa 2012-03-20 17:02:01

+0

我建议你问一个新问题,显示所用代码的[SSCCE](http://sscce.org/)。 – 2012-03-20 18:01:25

+0

是的,我听到那些奇迹般地治好了一切。我会接受的。 – corsiKa 2012-03-20 19:04:08

0

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

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

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

可以使用WindowAdapter的类来保存实现WindowListener的接口(它包括一个空实现各种方法的,所以你可以重写你关心的)的所有方法。

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