2012-09-26 136 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類。