외부 시스템에서 지속적으로 UDP 데이터를 전송하는 Java 프로그램이 있습니다.Java DatagramSocket에서 수신 버퍼를 "지우는"방법은 무엇입니까?
주기적으로 (다른 컴퓨터가 처리하기 때문에) 데이터 수신을 중지해야합니다. 그 시간 동안, 내 소켓 리더 스레드가 수면 루프에 들어갑니다. 패킷 수신을 시작해야 할 때, 다시 socket.receive(Packet)
에 들어가서 패킷이 가득 찬 버퍼를 가지고 있어야합니다. 이 아닌이 처리되어야합니다. (데이터가 "중지 시간"에있는 동안 나타납니다.)
DatagramSocket의 버퍼를 지울 수있는 방법이 있습니까?
그렇지 않은 경우 어떤 대안이 가장 좋습니까? 대기 상태로 들어갈 때 버퍼 크기를 0으로 설정하고 패킷을 다시 서비스하기 시작할 때 다시 가져 옵니까? 기다리는 동안 소켓을 닫고 돌아올 때 새 것을 엽니 다.
나는 그것을 좋아한다. 어쨌든 기계는 데이터를 가져오고 실제 socket-IO는 비교적 저렴하다. 그러나 패킷을 처리해야하는 사람을 결정하기 위해 패킷에 추가 정보가 없으면 여전히 "중지 시간"및 "다른 컴퓨터"와 경쟁 조건이 발생할 수 있습니다. –
패킷이 어떤 종류라고 가정하면 그들에 대한 정보를 식별 할 수 있다면, 어떤 신호를 끄면 "id 1400000 이후의 패킷을 수락하지 마십시오"라고 말할 수 있어야합니다. 이것은 죽은 신호가 도착하더라도 1399999를 처리하는 이점이 있습니다. kill 신호가 수신되면 노드에 도달합니다. – corsiKa
@pst 예, 경쟁 조건이 있습니다. 다행스럽게도 전환은 거의 발생하지 않습니다 (클러스터의 일부이며 기본 클러스터가 다운되어 핫 백업으로 이동해야 할 때 트리거됩니다). 그 시간 동안 약간의 데이터를 잃어 버리는 것은 용인 할 수 있습니다 (정확한 정확성은 요구되지 않지만 가능한 한 정확하고 과도하게 계산하고 싶지는 않습니다). –