2017-09-04 1 views
0

서버 소켓 채널이 수락을 수신하도록 등록 된 것으로 간주됩니다. 수락 된 채널은 읽기 용으로 등록되고 일단 읽기 용으로 등록되면 쓰기 용으로 등록됩니다. 키를 interestOps 메소드를 사용하여 SelectionKey의 관심 분야 세트로 이동하십시오.SelectionKey.interestOps (int ops)의 기본 동작

그러나 우리가 실제로 여기에 어떻게됩니까 예컨대 key.interestOps(key.interestOps() & ~SelectionKey.OP_READ);

의 핵심에서 일부 interestOps을 제거 할 때? 이것은 서버가이 소켓에 속하는 채널에 들어오는 요청을 수신하지 않을 것이며, 소스 채널은 서버에 의한이 결정을 잊어 버리고 서버에 데이터를 계속 보낼 수 있다는 의미입니까? 아니면 어떻게 든이 결정을 채널 소스에 알릴 것입니다. 패킷 스위칭 용어로

+1

'일단은 쓰기에 등록 읽기'아니,이 쓰기에 등록 된 경우에만,'쓰기()'는 0을 반환하고, 다음 시간을 등록 해제는하지 않습니다. 다른 사용법은 올바르지 않습니다. – EJP

답변

1

그러나, 우리를 서버에 패킷을 수신하고 채널이 패킷에 대한 interestKeys 속하는 경우 단지 패킷을 삭제하는 것으로 "해제"로 상기 동작 효과적으로 같다 예를 들어 키에서 약간의 interestOps를 제거하십시오. key.interestOps(key.interestOps() & ~SelectionKey.OP_READ);

실제로 여기 무슨 일이 일어 났습니까?

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

이 서버가 그냥 의미

이 소켓에 속하는 채널로 들어오는 요청을 수신하지 않을 것이라는 뜻 : 말 그대로 어떻게됩니까

뭔가처럼 소켓을 통해 데이터가 도착할 경우 SelectorOP_READ 이벤트를 트리거하지 않습니다. 데이터가 수신되지 않는다는 의미는 아닙니다.

소스 채널은 서버가이 결정을 무시하고 서버로 데이터를 계속 전송할 수 있습니까? '소스 채널'에 의해 당신이 피어를 의미하는 경우 수신 버퍼가 수신기에 채워하지 않는

, 그것은, 어쨌든에서 권고하지 않습니다.

또는 어떻게하면이 결정을 채널 소스에 알릴 것입니까?

, 상기 동작은 효과적으로 서버에 패킷을 수신하고 채널이 패킷에 대한 interestKeys가 된 것으로 "해제"에 속하는 경우 단지 패킷을 드롭과 같은 패킷 스위칭 용어로 호

인 .

번호

+0

그래서 우리가 키에서 interestOps를 제거하고 잠시 후 다시 추가하면 소켓을 통해 도착한 모든 데이터는 어떻게됩니까? 선택기가 어떻게 든 대기열을 사용하여 재생하거나 데이터가 "손실"되었습니까? –

+1

그것은 소켓 수신 버퍼에 머무르고, 읽기에 의해 소모 될 때까지 OP_READ 이벤트를 발생시킵니다. OP_READ는 단순히 '소켓 수신 버퍼에 데이터가 있음'을 의미합니다. 연결이 재설정되지 않으면 TCP가 데이터를 버리지 않습니다. 소켓 수신 버퍼 *는 대기열입니다. – EJP