2013-09-07 7 views
2

수신 된 UDP 패킷을 파일에 저장하고 각 패킷의 수신 시간을 각 패킷과 함께 저장하는 응용 프로그램이 있습니다. 패킷을 수신 할 때 수신 시간을 얻으려면 System.currentTimeMillies()을 사용하고 있습니다.자바에서 시스템의 시간과 무관 한 시계

나는이 파일을 UDP로 전송할 때마다 각 패킷을 저장 한 시간과 동기화하여 파일에서 각 패킷을 전송하기 때문에 시간을 저장할 필요가있다.

문제는 패킷을 받고 저장하는 동안 시스템 날짜와 시간을 변경하면 파일을 보내는 동안 동기화가 엉망이된다는 것입니다.

그래서 시스템 날짜 및 시간에 관계없이 수신 된 각 패킷에 타임 스탬프가 필요합니다. 송신하는 동안 수신하는 동안 시스템 날짜와 시간이 변경 되더라도 전송 속도는 동기화됩니다.

나는 이것들이 System.nanoTime()으로 얻을 수 있다는 것을 알고 있지만, 이것을 사용해도 안전할까요? 나는 System.nanoTime()가 다른 시스템 아키텍처와 운영체제에서 정확하지 않을 수도 있다고 생각한다.

System.nanoTime() 또한 프로그램을 실행하는 동안 마지막 값으로 끝내지 않으므로이 시계가 시작되는 방법 (초기 값)을 사용합니다. System.nanoTime() 시계에 대한 첫 번째 호출에서 0부터 시작하는 경우이 시계는 약 290 년 동안 실행되어 마지막 값으로 끝납니다.

System.nanoTime()에 대한 대안이 있습니까? 밀리 초 단위로 시계의 정확성이 필요합니다.

다른 시스템에서 파일을 전송할 수 있기 때문에이 시계가 시스템과 독립적으로 실행되어야합니다. 또한 다른 시스템간에 절대로 여러 날이나 몇 달 동안 시간을 ​​왜곡해서는 안됩니다.

감사

+0

왜 당신이 당신의 UDP 패킷을 내 보낸 날짜를 넣어하지 않습니다 (이하 290년를 실행하여 시스템을 가정) 오버 플로우를 처리하려면

는, 임의의 시작 지점 및 저장의 차이를 사용할 수 있습니까? – Julien

+0

UDP를 보내는 응용 프로그램이 제 권한을 가지고 있지 않습니다. 해당 응용 프로그램을 수정할 수 없습니다. – UDPLover

답변

1

System.nanoTime()는 시스템의 날짜가 변경되는 경우 변경되지 않습니다 날짜를 얻을합니다 (JDK 내에서) 유일한 방법입니다.

public static final long START = System.nanoTime(); 

//when receiving packet: 
long date = System.nanoTime(); 
packet.setTimestamp(date - START); 
+0

System.nanoTime()은 다른 시스템보다 정확할까요? 다른 컴퓨터에서 파일을 보내고 있기 때문에 다른 파일이 만들어지지 않은 것입니다. – UDPLover

+0

프로그램이 컴퓨터에서 파일을 보내려면 몇 달 동안 실행 중일 수 있습니다. 그래서 완벽한 시계가 필요합니다. – UDPLover

+0

'System.nanoTime'이 (가) 특정 기계가 아닙니다. "완벽한 시계"가 필요한 경우 NTP 서버에 의존 할 수 있습니다. Alternativele, 중요한 것은 패킷의 순서입니다. 서버에 자동 증가 ID를 제공하면됩니다. – assylias

관련 문제