2013-04-08 22 views
1

我有一個網狀客戶端沒有基本如下:網狀:channel.write()不成功,原因是空

通過TCP連接到服務器後,程序調用下面的代碼片段。第一次順利,但第二次有以下症狀 - 它會永遠循環。通道已連接。 channelFuture.isDone()== false。 channelFuture.isSuccess()== false和channelFuture.getCause()== null。我沒有看到任何例外,或者有任何信息可以幫助我理解問題所在。任何想法如何獲得更多信息來調試此問題?

ChannelFuture channelFuture = null; 

    while (channelFuture == null || !channelFuture.isSuccess()) { 
     try { 
      channelFuture = channel.write(content); 
      channelFuture.await(1000); 

     } catch (InterruptedException ex) { 
      Logger.getGlobal().log(Level.SEVERE, "Interrupted ", ex); 
     } 
    } 

回答

4

我認爲你對如何處理ChannelFuture有問題。

在您的發佈代碼中,如果循環的任何迭代都會導致寫入失敗,則自從重新分配channelFuture後,循環的後續迭代開始後(1000毫秒後),此故障和原因將會丟失。此外,如果完成寫操作所需的時間超過1000毫秒,則在下一次迭代中將添加排隊寫入,並且在每次迭代之後進一步落後,因爲channelFuture會不斷更換,並且在檢查之前1000毫秒內永遠不會完成寫操作channelFuture.isSuccess()。

使用您的發佈代碼,您可以執行的操作是讀取返回值channelFuture.await(1000)以查看寫入是成功還是失敗,而不是盲目地繼續並丟棄channelFuture。

但是,理想情況下,您根本不應該使用ChannelFuture.await(),而應該使用ChannelFuture.addListener()來添加將在寫入完成時執行的偵聽器。這是使用Netty並使用異步代碼的正確方法。