2017-09-04 522 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