2012-09-26 102 views
0

我有一个简单的服务器客户端程序设置。用户开始监听连接,并出现一个对话框,并显示“正在侦听连接”和一个取消按钮。如果他点击取消,则关闭服务器套接字。这很好。让ServerSocket接受连接,想连接时关闭对话框

我想要的是使“Listening ...”对话框在连接时消失。

目前ListenDialog是一个可运行的,因为我试图把accept()放在那里,或者while(true), if socket != null, dispose();...没有任何工作。该对话框设置为Modal,因为否则accept()块和对话框GUI(即取消按钮)从不绘制;即使run()方法永远不会运行,直到accept()停止阻止,即使它似乎应该在单独的线程中。

因此,我可以通过将dispose()放入对话框的run()方法中并使对话框为非模式来获得我想要的关闭功能,但它不会绘制GUI,因此取消按钮无法使用。我可以通过制作对话框模式来获得我的GUI和取消按钮,但即使在accept()停止阻止run()方法后,它似乎也没有做任何事情(即对话框直到手动关闭,甚至没有播放run()代码。 )

请告诉我有什么明显的我失踪了!

ListenDialog listener = new ListenDialog(); 

Thread listenThread = new Thread(listener); 
listenThread.start(); 

try { 
    socket = server.accept(); 
    listener.dispose(); 
} catch(IOException e1) { 
    addMessage("Accept Failed: " + e1.getMessage()); 
} 
+0

如果'listenThread'什么都不做,只能使用监听器,为什么不在socket套接字后把它杀掉呢? – noMAD

+0

您是否尝试过使用AsyncTask或类似的东西?我想你不应该接受gui线程上的套接字... – Fildor

回答

0

好吧,我不是100%肯定该解决方案是如何工作或者是什么重要的区别是从任何其他的事情我想......但在这里它是。

ListenDialog的构造函数现在包含为其自身创建的新线程。 run()方法包含accept()调用,然后在try/catch块外面调用dispose()。上面显示的所有代码(除了创建新的ListenDialog)已移入ListenDialog类。