2017-09-04 52 views
0

我知道服務器套接字通道被註冊爲偵聽接受,當接受一個通道被註冊爲讀取,並且一旦讀取它被註冊爲寫入,並且通過添加相關使用interestOps方法設置SelectionKey的興趣集。SelectionKey.interestOps的基礎工作(int ops)

然而,當我們從e.g key.interestOps(key.interestOps() & ~SelectionKey.OP_READ);

的關鍵究竟是什麼發生在這裏刪除一些interestOps?這是否意味着服務器將不會偵聽任何傳入的屬於此套接字的請求,並且源通道將忽略服務器的這一決定,並可能繼續向服務器發送數據?或者它會以某種方式告知決定的渠道來源。

在分組交換的說法,是上述操作有效地相同的服務器接收數據包和只丟棄分組,如果該信道該分組的interestKeys屬於已經「未設置」

+1

號「有一次讀它註冊爲寫」不,它註冊爲寫當且僅當'寫()'返回零,並註銷下一次它沒有。任何其他用法都不正確。 – EJP

回答

1

然而,當我們從一個密鑰中刪除一些interestOps,例如key.interestOps(key.interestOps() & ~SelectionKey.OP_READ);

這裏實際發生了什麼?

什麼字面上的情況是這樣的:

public void interestOps(int interestOps) 
{ 
    this.interestOps = interestOps; 
} 

這是否意味着服務器將只是沒有任何傳入的請求聽通道屬於此套接字

這意味着如果數據通過套接字到達,Selector將不會觸發任何OP_READ事件。這並不意味着不會收到數據。

並且源通道將忽略服務器的這個決定並可能繼續向服務器發送數據?

如果'源通道'是指對等體,那麼不建議,除非接收緩衝區填滿接收機。

或者它會以某種方式通知此決定的渠道來源。

號在分組交換的說法,是上述操作有效地相同的服務器接收數據包和只丟棄分組,如果該信道該分組的interestKeys屬於已經「未設置」 。

+0

因此,一旦我們從密鑰中刪除interestOps,並在一段時間後再添加它,那麼從那以後通過套接字到達的所有數據會發生什麼?選擇器是否會以某種方式重播它,或者數據是否「丟失」? –

+1

它保留在套接字接收緩衝區中,並導致OP_READ事件,直到它被讀取耗盡。 OP_READ只是意味着「在套接字接收緩衝區中有數據」。 TCP不會丟棄數據,除非重新連接。套接字接收緩衝區*是隊列。 – EJP