2016-11-11 14 views
0

Я пытаюсь захватить метку времени с сервера nist.gov, используя приведенный ниже код.DatagramPacket getData() не работает

InetAddress addr = InetAddress.getByName("129.6.15.30"); 
DatagramSocket s = new DatagramSocket(); 
System.out.println("Connected to: "+addr.getHostName()); 

byte[] buf = new byte[4]; 
DatagramPacket p = new DatagramPacket(buf, buf.length, addr, 37); 
s.send(p); 
System.out.println("message sent"); 

DatagramPacket dp = new DatagramPacket(buf, buf.length); 
s.receive(dp); 
String data = new String(dp.getData(), 0, dp.getLength()); 
System.out.println("Received: "+data); 

Когда я запускаю это на Eclipse, я возвращаю обратно в консоль.

Connected to: time-c.nist.gov 
message sent 
Received: ÛÏÌ< 

Хорошая новость: я подключаюсь к правильному серверу и получаю обратно пакет. Однако я просто не могу превратить данные этого пакета в приемлемое представление этих данных. Что мне не хватает?

ответ

0

Ответ от протокола времени - это 32-битное целое число в байтовом порядке сети - это не строка.

Чтобы прочитать его вам нужно использовать что-то вроде DataInputStream:

DataInputStream dis = new DataInputStream(new ByteArrayInputStream(dp.getData(), 0, dp.getLength())); 

int time = dis.readInt(); 

dis.close(); 

Значение времени Возвращается количество секунд, прошедших с 1 января 1900 года, чтобы получить Java Instant из этого мы должны преобразовать целое число без знака на стандартную «эпоху Java», которая представляет собой количество секунд с 1 января 1970 года:

long secondsSince1Jan1900 = Integer.toUnsignedLong(time); 

long differenceBetweenEpochs = 2208988800L; 

long secondsSince1Jan1970 = secondsSince1Jan1900 - differenceBetweenEpochs; 

Instant instant = Instant.ofEpochSecond(secondsSince1Jan1970); 
+0

Это определенно помогло, так как мой новый полученный результат получил: -607100146. Теперь, чтобы выяснить, как преобразовать это в метку времени стандартного формата. – MPeal

+0

Добавлено преобразование в 'Instant' –

+0

Спасибо, Грег, так как это сработало, и я получил следующий вывод на мгновение: 2016-11-11T18: 27: 50Z. И хотя я благодарю вас за этот ответ, я не хочу просто говорить: «Отлично! Этот парень сделал это для меня!» Мне любопытно, что означает «L» после 2208988800. Я понимаю, что 2208988800 - это количество секунд между 1/1/1900 и 1/1/1970, но что такое L (простите меня, я только кодирование на Java в течение 4,5 месяцев, и небольшие детали, подобные этому, иногда меня избегают). – MPeal

 Смежные вопросы

  • Нет связанных вопросов^_^