2017-07-21 14 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の関心を登録解除することです。内部チャネルが1つしかない場合は、すべてのチャネルに対して登録を解除します。その後、チャンネル上でisReadable()イベントを取得することさえできません。キューがクリアされたら、OP_READを再登録します。

影響を受けるピアの送信をブロックすることです。

リクエストの読み取りを再試行するにはどうすればよいですか?

このような方法で再試行する必要はありません。通常の方法でisReadable()に反応してください。実際には、最初に読んだことがないので、あなたのやり方も何もやり直す必要はないので、再試行することはありません。

NB client.read()が-1を返した場合、それは完全にbreakに奇妙です。 チャンネルを終了してください。 1つのクライアントが切断されただけなので、他のイベントを処理しない理由はありません。

+0

ありがとうございます。これは完璧に聞こえる。 (Btw、私が投稿した抜粋はちょうどテストコードです、私はclient.read()が-1を返すときに中断しません) – user1071840

関連する問題