Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的ntp客户端_Python - Fatal编程技术网

python中的ntp客户端

python中的ntp客户端,python,Python,我已经用python编写了一个ntp客户机来查询时间服务器并显示时间和程序执行情况,但没有给出任何结果。 我使用的是python的2.7.3集成开发环境,我的操作系统是Windows7。 代码如下: # File: Ntpclient.py from socket import AF_INET, SOCK_DGRAM import sys import socket import struct, time # # Set the socket parameters host = "pool

我已经用python编写了一个ntp客户机来查询时间服务器并显示时间和程序执行情况,但没有给出任何结果。 我使用的是python的2.7.3集成开发环境,我的操作系统是Windows7。 代码如下:

# File: Ntpclient.py
from socket import AF_INET, SOCK_DGRAM
import sys
import socket
import struct, time

# # Set the socket parameters 

host = "pool.ntp.org"
port = 123
buf = 1024
address = (host,port)
msg = 'time'


# reference time (in seconds since 1900-01-01 00:00:00)
TIME1970 = 2208988800L # 1970-01-01 00:00:00

# connect to server
client = socket.socket( AF_INET, SOCK_DGRAM)
client.sendto(msg, address)
msg, address = client.recvfrom( buf )

t = struct.unpack( "!12I", data )[10]
t -= TIME1970
print "\tTime=%s" % time.ctime(t)
应该是

msg = '\x1b' + 47 * '\0' 
而不是

msg = 'time'

但正如Maksym所说,您应该使用ntplib。

如果我的答案不能满足您的期望,那么很抱歉。我认为使用现有的解决方案是有意义的。是使用NTP服务器的非常好的库。

使用:

以下内容应适用于Python 2和Python 3:

import ntplib
from time import ctime
c = ntplib.NTPClient()
response = c.request('pool.ntp.org')
print(ctime(response.tx_time))
输出:

Fri Jul 28 01:30:53 2017

下面是上述解决方案的修复程序,它为实现增加了几秒钟的时间,并正确地关闭了套接字。由于它实际上只是几行代码,我不想在我的项目中添加另一个依赖项,尽管在大多数情况下,
ntplib
无疑是最好的选择

#!/usr/bin/env python
from contextlib import closing
from socket import socket, AF_INET, SOCK_DGRAM
import struct
import time

NTP_PACKET_FORMAT = "!12I"
NTP_DELTA = 2208988800  # 1970-01-01 00:00:00
NTP_QUERY = b'\x1b' + 47 * b'\0'  

def ntp_time(host="pool.ntp.org", port=123):
    with closing(socket( AF_INET, SOCK_DGRAM)) as s:
        s.sendto(NTP_QUERY, (host, port))
        msg, address = s.recvfrom(1024)
    unpacked = struct.unpack(NTP_PACKET_FORMAT,
                   msg[0:struct.calcsize(NTP_PACKET_FORMAT)])
    return unpacked[10] + float(unpacked[11]) / 2**32 - NTP_DELTA


if __name__ == "__main__":
    print time.ctime(ntp_time()).replace("  ", " ")

为什么不使用ntplib?非常感谢大家,我包括了库文件:从time import ctime开始,它与
ntplib
一起发出了一个小警告,它仍然有一个bug,它没有正确解析
root\u delay
:root\u delay是正确的。(请参阅本期最新评论)最精确的用法是通过偏移量校准本地时钟:
fixed\u time=response.offset+time.time()
。这比来自时间服务器的简单时间戳更精确,因为ntplib的偏移被网络往返延迟的一半校正。虽然这可能回答了问题(我不确定),但通常最好包括一些解释,说明为什么(以及如何)解决问题。这尤其适用于回答一年多前提出的问题,并且已经有了旧的线程,但这对我来说是一个好的、快速的解决方案,而不是试图找出如何将模块添加到我的构建系统(Petalinux)中。如果您想知道
'\x1b'+47*'\0'
代表什么:我喜欢这个答案,因为它的依赖性较小UDP套接字是无连接的,因此没有什么可以或需要关闭的。当然,使用
ntplib
的原始解决方案也可以使用几秒钟。其优点只是去除了dependency@hynekcer感谢更新到现代!关于套接字:据我所知,它无论如何都应该关闭,只是为了节省本地资源。打开的套接字数量是有限的,对于长时间运行的进程,它们不应该被泄漏。
#!/usr/bin/env python
from contextlib import closing
from socket import socket, AF_INET, SOCK_DGRAM
import struct
import time

NTP_PACKET_FORMAT = "!12I"
NTP_DELTA = 2208988800  # 1970-01-01 00:00:00
NTP_QUERY = b'\x1b' + 47 * b'\0'  

def ntp_time(host="pool.ntp.org", port=123):
    with closing(socket( AF_INET, SOCK_DGRAM)) as s:
        s.sendto(NTP_QUERY, (host, port))
        msg, address = s.recvfrom(1024)
    unpacked = struct.unpack(NTP_PACKET_FORMAT,
                   msg[0:struct.calcsize(NTP_PACKET_FORMAT)])
    return unpacked[10] + float(unpacked[11]) / 2**32 - NTP_DELTA


if __name__ == "__main__":
    print time.ctime(ntp_time()).replace("  ", " ")