我了解服务器套接字通道已注册为侦听接受,接受通道时将其注册为读取,一旦读取则将其注册为写入,这是通过使用interestOps方法将相关键添加到SelectionKey的兴趣集中来完成的。

但是,当我们从键中删除某些interestOps时,例如key.interestOps(key.interestOps() & ~SelectionKey.OP_READ);

这里实际发生了什么?这是否意味着服务器将不会仅侦听对属于此套接字的通道的任何入站请求,而源通道将不理会服务器的此决定,并可能继续向服务器发送数据?还是以某种方式将这一决定告知渠道来源。

用数据包交换的话来说,上述操作实际上与服务器接收数据包并且如果该数据包所属通道的interestKeys已“未设置”只是丢弃数据包相同。

最佳答案

但是,当我们从键中删除某些interestOps时,例如key.interestOps(key.interestOps() & ~SelectionKey.OP_READ);
  
  这里实际发生了什么?


实际发生的事情是这样的:

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



  这是否意味着服务器将不会只侦听属于此套接字的通道的任何传入请求


这意味着如果数据通过套接字到达,则Selector不会触发任何OP_READ事件。这并不意味着将不会接收数据。


  并且源通道将忽略服务器的此决定,并可能继续向服务器发送数据?


如果通过“源通道”来表示对等方,则无论如何都不建议这样做,除非接收缓冲区在接收方已满。


  还是以某种方式将这一决定告知渠道来源。


没有。


  用分组交换的话来说,上述操作实际上与服务器接收分组并且如果该分组所属于的信道的兴趣密钥已被“取消设置”,只是丢弃该分组相同。


没有。

关于java - SelectionKey.interestOps(int ops)的基础工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46044633/

10-11 04:56