DatagramPacket getData() не работает

Я пытаюсь получить метку времени с сервера nist.gov, используя приведенный ниже код.

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: ÛÏÌ<

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

1 ответ

Решение

Ответ от протокола времени - 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);
Другие вопросы по тегам