用socket从服务器读取时间

package socket;

import java.io.*;
import java.net.*;
import java.text.*;
import java.util.*;

// 时间协议客户端
public class DaytimeClient {

    // 要连接到的主机名
    private final static String hostname = "time.nist.gov";

    // 解析时间方法
    static Date parseDate(String s) throws ParseException {
        String[] pieces = s.split(" ");// 以空格为分割点,分割s
        String datetime = pieces[1] + " " + pieces[2] + " UTC";
        DateFormat format = new SimpleDateFormat("yy-MM-dd hh:mm:ss z");
        return format.parse(datetime);
    }

    // 用socket从服务器读取
    public static void main(String[] args) {
        try (Socket socket = new Socket(hostname, 13);
                InputStreamReader reader = new InputStreamReader(
                        socket.getInputStream(), "ASCII");) {

            // 设置超时
            socket.setSoTimeout(15000);

            StringBuilder time = new StringBuilder();

            for (int b = reader.read(); b != -1; b = reader.read()) {
                time.append((char) b);
            }

            // 打印时间
            System.out.println(parseDate(time.toString()));

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}
package socket;

import java.io.*;
import java.net.*;
import java.text.*;
import java.util.*;

// 时间协议客户端
public class Time {

    // 要连接到的主机名
    private final static String hostname = "time.nist.gov";

    // 用socket从服务器读取
    public static void main(String[] args) throws IOException, ParseException {
        Date time = Time.getDateFromNetwork();
        System.out.println("现在的时间是:" + time);
    }

    public static Date getDateFromNetwork() throws IOException, ParseException{

        // 时间协议和Date类之间的时间差
        long differenceBetweenEpochs = 2208988800L;

        try (Socket socket = new Socket(hostname, 37);
                InputStream in = socket.getInputStream();) {

            // 设置超时
            socket.setSoTimeout(15000);

            long secondsSince1900 = 0;

            for (int i = 0; i < 4; i++) {
                secondsSince1900 = (secondsSince1900 << 8 | in.read());
            }

            long secondsSince1970 = secondsSince1900 - differenceBetweenEpochs;

            long msSince1970 = secondsSince1970 * 1000;

            Date time = new Date(msSince1970);

            return time;

        } 

    }
}

这里写图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值