2012-11-22 72 views
1

我已經編寫了一個帶有多個線程的小型服務器。 經過很多小時(據說目前我無法重現該問題)服務器停止工作。我的代碼看起來像這樣。Java-Server停止正常工作

線程2:

while(true) 
{ 

       System.out.println("Point 1"); 
       Socket abc = serverSocket.accept(); 
       System.out.println("Point 2"); 
       connection = true; 
} 

線程1等待在了Thread.sleep(1000)循環,並檢查是否連接是真實的。如果是這樣,它開始工作,否則它打印「等待」。如果連接中止,它將連接設置爲false。

現在我的Mainprogramm連接到服務器。服務器打印 等待 等待 (依此類推,直到連接建立) 點1 點2 它應該。 (通過clientSocket = new Socket(inetAddress,Integer.parseInt(port))完成的連接);當此命令成功時,假設連接沒有異常,則建立連接) 。

運行Thread1多小時後,只打印「等待」,「等待」,不管我多久與客戶端連接。 我很難過,因爲它只發生在多個小時的運行之後。 Java版本是 Java版本「1.7.0_07」 Java™SE運行時環境(版本1.7.0_07-b10) 此版本是否存在任何已知問題或者哪裏可能是錯誤?任何線索如何重現錯誤?

感謝您的幫助。

+0

您是否考慮在調試器中執行線程轉儲或運行服務器以獲取有關正在進行的更多信息? –

+0

現在。問題1是服務器在另一臺機器上作爲開發機器運行。問題2我沒有辦法暫停eclipse調試器中的線程,然後向我顯示它現在的位置excecute.s。那可能嗎?如果是這樣,你可以發佈一個鏈接到一個指令嗎? – ServerSocketAccept

+0

現在我設法用eclipse進行調試。服務器現在在開發機器上運行。讓我們希望這個問題再次發生,我可以調試它。 – ServerSocketAccept

回答

0

我終於解決了這個問題。 這是足夠的代碼

InetAddress inetAddress = InetAddress.getByName("0.0.0.0"); 
serverSocket = new ServerSocket(39999,0,inetAddress); 

和我的客戶說連接。不需要像這樣的代碼

Socket neuSocket = serverSocket.accept(); 

整個線程因while循環中的catch-block而終止。 Java有時非常混亂。如果線程已經停止了ServerSocket的聲明,那麼它不應該再在該套接字上偵聽。

0

如果不同步訪問connection領域,它不是一個volatile字段,然後一個線程1可能不會看到connection在線程2已經改變。這就是Java Memory Model的工作原理。

+0

我使用第三個類與形式公共靜態同步無效setConnection(布爾連接)的atatic方法,以避免什麼jzou建議。但即使這是其他線程不知道連接現在存在的問題,它也不會打印出「應該是的點1和點2」。 – ServerSocketAccept