2011-12-08 4 views
5

외부 시스템에서 지속적으로 UDP 데이터를 전송하는 Java 프로그램이 있습니다.Java DatagramSocket에서 수신 버퍼를 "지우는"방법은 무엇입니까?

주기적으로 (다른 컴퓨터가 처리하기 때문에) 데이터 수신을 중지해야합니다. 그 시간 동안, 내 소켓 리더 스레드가 수면 루프에 들어갑니다. 패킷 수신을 시작해야 할 때, 다시 socket.receive(Packet)에 들어가서 패킷이 가득 찬 버퍼를 가지고 있어야합니다. 이 아닌이 처리되어야합니다. (데이터가 "중지 시간"에있는 동안 나타납니다.)

DatagramSocket의 버퍼를 지울 수있는 방법이 있습니까?

그렇지 않은 경우 어떤 대안이 가장 좋습니까? 대기 상태로 들어갈 때 버퍼 크기를 0으로 설정하고 패킷을 다시 서비스하기 시작할 때 다시 가져 옵니까? 기다리는 동안 소켓을 닫고 돌아올 때 새 것을 엽니 다.

답변

4

소켓에 정지 시간을 갖는 것이 아니라 패킷을 처리하는 모든 코드에서 작동 중지 시간을 가져야합니다.

그래서 소켓은 정상적으로 계속 수신되지만, 다운 타임이 발생하면 즉시 패킷을 삭제합니다.

가장 효율적인 솔루션은 아니지만 실제로 구현하기 쉽고 노드가 다른 시간에 다른 유형의 패킷을 수신 할 수 있도록 열어두기 때문에 유용 할 수 있습니다.

+0

나는 그것을 좋아한다. 어쨌든 기계는 데이터를 가져오고 실제 socket-IO는 비교적 저렴하다. 그러나 패킷을 처리해야하는 사람을 결정하기 위해 패킷에 추가 정보가 없으면 여전히 "중지 시간"및 "다른 컴퓨터"와 경쟁 조건이 발생할 수 있습니다. –

+0

패킷이 어떤 종류라고 가정하면 그들에 대한 정보를 식별 할 수 있다면, 어떤 신호를 끄면 "id 1400000 이후의 패킷을 수락하지 마십시오"라고 말할 수 있어야합니다. 이것은 죽은 신호가 도착하더라도 1399999를 처리하는 이점이 있습니다. kill 신호가 수신되면 노드에 도달합니다. – corsiKa

+0

@pst 예, 경쟁 조건이 있습니다. 다행스럽게도 전환은 거의 발생하지 않습니다 (클러스터의 일부이며 기본 클러스터가 다운되어 핫 백업으로 이동해야 할 때 트리거됩니다). 그 시간 동안 약간의 데이터를 잃어 버리는 것은 용인 할 수 있습니다 (정확한 정확성은 요구되지 않지만 가능한 한 정확하고 과도하게 계산하고 싶지는 않습니다). –

관련 문제