首页 > 解决方案 > 从远程电脑获取系统时间

问题描述

有没有办法从java中的远程PC获取系统时间?远程 PC 与客户端 PC 位于同一网络中。

有一些带有 java gui 的客户端。gui 应该在远程 PC 上登录相同的文件。为此,我使用了 slf4j api 的 RollingFileAppender。但我想,日志时间是服务器时间。客户可以有不同的时间,他们无权更改时钟。
所以我的想法是获取远程PC服务器时间,获取时差并记录服务器时间。
但我找不到类似的东西。
客户端和服务器没有互联网连接。而且我不想在服务器上更改某些内容。只有在没有其他办法的情况下。
gui 使用 java 1.6 运行。

我知道 TCP 连接有一些方法。但为此我必须编写和执行服务器程序或安装 NTP 服务器。

你有什么建议或想法来解决我的问题吗?

标签: javaslf4jsystemtime

解决方案


我找到了解决我的问题的方法。
我在windows上激活了ntp服务器。
在 gui 启动时,我得到了从远程 pc 到客户端的时间差。

NTPUDPClient client = new NTPUDPClient();
client.setDefaultTimeout(5000);
client.open();
InetAddress hostAddr = InetAddress.getByName(confFile.getIpAddresse());
TimeInfo info = client.getTime(hostAddr, 8110);
info.computeDetails(); // compute offset/delay if not already done
Long offsetValue = info.getOffset();
Long delayValue = info.getDelay();
String delay = (delayValue == null) ? "0" : delayValue.toString();
String offset = (offsetValue == null) ? "0" : offsetValue.toString();
System.out.println(" Roundtrip delay(ms)=" + delay + ", clock offset(ms)=" + offset); 
// offset in ms
client.close();
StaticVariables.timeDifference = Long.parseLong(offset);  

为了修改 log4j 日志记录的时间戳,我创建了一个自定义 RollingFileAppender:

public class CustomRollingFileAppender extends RollingFileAppender
{
    @Override
    protected void subAppend(LoggingEvent event)
    {
        LoggingEvent modifiedEvent = new LoggingEvent(event.getFQNOfLoggerClass(), event.getLogger(),
                event.getTimeStamp() + StaticVariables.timeDifference, event.getLevel(), event.getMessage(), event.getThreadName(),
                event.getThrowableInformation(), event.getNDC(), event.getLocationInformation(), event.getProperties());

        super.subAppend(modifiedEvent);
    }
}

在这个 appender 中,我添加了 time difference event.getTimeStamp() + StaticVariables.timeDifference


推荐阅读