2017-07-21 52 views
0

我正在處理傳輸機制,如果內部隊列已滿,我應該忽略套接字上的OP_READ事件。重試讀取套接字級別上的客戶請求

SelectionKey next = it.next(); 

    if (next.isReadable()) { 
     SocketChannel client = (SocketChannel) next.channel(); 

     if (!innerqueueIsFull()) { 
      if (client.read(nextRead) == -1) { 
       break; 
      } 
     } 
    } 

在爲其中一個未決請求寫入響應之後,我想返回並重試讀取通道上的數據包。我如何重試讀取請求?

回答

1

我正在處理傳輸機制,如果內部隊列已滿,我應該忽略套接字上的OP_READ事件。

正確的方法是在OP_READ中註銷該通道的興趣,或者如果只有一個內部隊列,則註銷所有通道。那麼你甚至不會在頻道上看到isReadable()事件。當隊列清除時,重新註冊OP_READ。

效果將會阻止受影響的對等體發送。

我該如何重試讀取請求?

您不必以這種方式重試任何事情。只需以正常方式對isReadable()作出反應。事實上,你不必以任何方式重試,因爲你從來沒有讀過,所以沒有什麼可以重試。

NB如果client.read()返回-1,則完全奇怪break。您應該關閉頻道繼續。沒有理由不處理其他事件只是因爲一個客戶端已斷開連接。

+0

謝謝。這聽起來很完美。 (順便說一句,我發佈的代碼段只是測試代碼,當client.read()返回-1時我不會中斷) – user1071840

相關問題