2016-04-18 30 views
0

我是一個網絡初學者,我正在一個遊戲中實現它,它主要是在工作,但在客戶端,我的循環接收數據包正在停止嘗試抓住。這裏是代碼:雖然真正的循環正被Java中的try/catch所破壞

public void run() { 
    while(true){ 
     byte[] data = new byte[1024]; 
     DatagramPacket packet = new DatagramPacket(data, data.length); 
     try { 
      socket.receive(packet); 
     }catch(IOException e){ 
      e.printStackTrace(); 
     } 

     this.parsePacket(packet.getData(), packet.getAddress(), packet.getPort()); 
    } 
} 

調試我發現,環路是沒有得到過去在try catch語句(但嘗試被沒有錯誤激活一次貌似)之後。

+0

請給您添加完整的異常堆棧跟蹤首先。 –

回答

1

作爲每java的文檔爲public void receive(DatagramPacket p)

此方法一直阻塞數據報在接收到方法。

執行流的線程被阻塞[等待直到收到數據報]。你的循環不會停止,只是處於暫停狀態。 在發生某些異常時,環路將被破壞,而這些異常不會在環路主體中捕獲和處理。

另外有一點建議,我希望你在你的代碼中實現。你不應該運行一個無限循環。您可以嘗試使用Thread.currentThread().isInterrupted(),而不是使用true,當遊戲結束時,您可以在負責執行循環代碼流的線程上調用interrupt()。此外,如果IOException的情況下,你想重試(可能在重試資源按順序,你沒有得到異常),然後把循環放入循環內是O.K.否則你可以將捕獲物移到循環外部,這取決於你的需求和流量。你可以放一個重試次數的計數器。

2

首先,您提供的循環條件不是variable,您直接使用布爾值true。這可能是infinite-loop的情況。

while(true){..... // yourCode ....} 

你的循環將繼續即使socket.receive(packet);線引發IOException,因爲這個異常是由catch()塊處理。

這意味着它會執行到在這條線

this.parsePacket(packet.getData(), packet.getAddress(), packet.getPort()); 

現在引發的任何異常,你的問題是這樣的方法public void receive(DatagramPacket p)其實方法將工作到datagram收到,但你的循環將持續到引發異常,直到this.parsePacket()方法引發了異常。

因此,請更改您的條件語句,如果datagram不存在,則循環必須終止。

+1

不錯的建議,我編輯我的答案解決無限循環... –

+1

我一定會嘗試,謝謝你的所有幫助! – Canyonman133

+1

快樂幫助:) –