2011-10-08 78 views
2

我正在設計一款網絡遊戲,因此我有一個客戶端,其中一個監聽線程來自服務器,而服務器也有一個監聽線程正在監聽來自客戶端的消息。有關多線程編程的賽車場景

在客戶端面板我下面的一個:發送一些信息給服務器
後來自同一個地方的兩行代碼與其他功能再次這樣做。
結果是有時運行良好並且有時會拋出異常的代碼運行。 在客戶端面板上的某個發送函數的行處拋出異常。

注:如果我把Thread.sleep(1000);兩者之間發送比不會拋出異常,但你知道這是一個壞的解決方案..
*
發送信息,以獨一無二的服務器線程的兩個功能是:

ClientCommunicationThread.UpdateServerOfTimeEnded 
ClientCommunicationThread.SendRequestToClosePlayerThreadAndRemoveItFromPlayersOnServer 

我怎樣才能解決這個問題
感謝。

這是堆棧跟蹤:

 
java.net.SocketException: Software caused connection abort: socket write error 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) 
    at java.net.SocketOutputStream.write(SocketOutputStream.java:115) 
    at java.io.DataOutputStream.writeInt(DataOutputStream.java:181) 
    at GUI.ClientCommunicationThread.UpdateServerOfTimeEnded(ClientCommunicationThread.java:850) 
    at GUI.JPanelMainGame$2.actionPerformed(JPanelMainGame.java:312) 
    at javax.swing.Timer.fireActionPerformed(Timer.java:271) 
    at javax.swing.Timer$DoPostEvent.run(Timer.java:201) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:597) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 
java.net.SocketException: Software caused connection abort: socket write error 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) 
    at java.net.SocketOutputStream.write(SocketOutputStream.java:115) 
    at java.io.DataOutputStream.writeInt(DataOutputStream.java:180) 
    at GUI.ClientCommunicationThread.SendRequestToClosePlayerThreadAndRemoveItFromPlayersOnServer(ClientCommunicationThread.java:824) 
    at GUI.JPanelMainGame$2.actionPerformed(JPanelMainGame.java:325) 
    at javax.swing.Timer.fireActionPerformed(Timer.java:271) 
    at javax.swing.Timer$DoPostEvent.run(Timer.java:201) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:597) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 
+0

+1,用於堆棧跟蹤 – doNotCheckMyBlog

回答

2

假設:這是因爲你使用的是同一個插座對象爲兩種功能,而這兩種功能想要寫的東西插座輸出流。我希望我是對的。基於這個我會去使用同步。下面的鏈接將引導你通過對對象進行鎖定的方式,以便兩個不同的線程不能訪問同一個對象。當你完成隱式鎖定而不是釋放時,你會創建隱式鎖定。 :)當然,你可以創建兩個不同的線程來調用兩個不同的函數。 (更安全......)

鏈接:Intrinsic Locks and Synchronization

希望這將幫助你解決。

+0

我嘗試了一些東西,但仍然無法使用。我試着去思考爲什麼兩個函數都想同時寫入它不可能是因爲它們會一個接一個地發送,所以在一次發送之後應該是第二次發送。我添加了更多相關的代碼 – JavaSa

+0

對不起,我不能粘貼更多的代碼,因爲它沒有縮進,就像netbeans「看到」它,它通過編譯!有些編輯規則有時是非常幼稚的。 – JavaSa

+0

這對我來說很難診斷沒有代碼:)。我建議同步,因爲你提到了你的Thread.sleep()測試。這清楚地表明代碼正在使用套接字寫入togeather。或者只是給我一個psuedo參考關於什麼基本上你的代碼,我可能會想辦法解決:) – doNotCheckMyBlog