2017-09-04 29 views
0

私はServerソケットチャンネルが受け入れのためにリスンするために登録されていると理解していますが、チャンネルが読み込み用に登録されていれば、読み込み用に登録されています。 interestOpsメソッドを使用して、SelectionKeyの関心セットにキーを移動します。SelectionKey.interestOps(int ops)の基本的な動作

しかし、我々はここで実際に何が起こる例えば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は、ソケット経由でデータが到着した場合には、いかなるイベントも発生させません。データが受信されないことを意味するものではありません。

ソースチャネルはこの決定をサーバーに知らせず、サーバーにデータを送信し続ける可能性がありますか?

「ソースチャネル」によってピアを意味する場合は、受信バッファが受信側でいっぱいになっていない限り、とにかくアドバイスされません。

この決定のチャンネルの情報源に何かお知らせしますか?用語パケット交換において

、サーバがパケットを受信し、ちょうどチャネルに対するinterestKeysこのパケットが「未設定」であったために属している場合、パケットをドロップするよう実質的に同じような動作であります。

+0

キーからinterestOpsを取り除いてからしばらくしてから、ソケットを介して到着したすべてのデータはどうなりますか?セレクタは何らかの理由でキューを使用して再生するのでしょうか、そのデータは単に "失われていますか"? –

+1

これはソケット受信バッファにとどまり、読み込みによって使い果たされるまでOP_READイベントを発生させます。 OP_READは単にソケット受信バッファにデータがあることを意味します。接続がリセットされない限り、TCPはデータを破棄しません。ソケット受信バッファ*はキューです。 – EJP

関連する問題