与前一个攻略不同,有时并不需要从NTP服务器上获取精确的时间。遇到这种情况,就可以使用NTP的简化版本,叫作“简单网络时间协议”。 1.13.1 实战演练 让我们不使用任何第三方库编写一个简单的SNTP客户端。 首先,定义两个常量:NTP_SERVER和TIME1970。NTP_SERVER是客户端要连接的服务器地址,TIME1970指1970年1月1日(也叫Epoch)。在http://www.epochconverter.com/上可以查看Epoch时间值,或者把时间转换成Epoch时间值。这个客户端通过UDP协议创建一个UDP套接字(SOCK_DGRAM),用于连接服务器。然后,客户端要在一个数据包中把数据'x1b' + 47 * ' '发给SNTP服务器。UDP客户端分别使用sendto()和recvfrom()方法发送和接收数据。 服务器返回的时间信息打包在一个数组中,客户端需要使用struct模块取出数据。我们所需的数据是数组中的第11个元素。最后,我们要从取出的数据上减掉TIME1970,得到真正的当前时间。 代码清单1-12展示了如何编写这个SNTP客户端,如下所示: #!/usr/bin/env python # Python Network Programming Cookbook -- Chapter - 1 # This program is optimized for Python 2.7. It may run on any # other Python version with/without modifications. import socket import struct import sys import time NTP_SERVER = "0.uk.pool.ntp.org" TIME1970 = 2208988800L def sntp_client(): client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) data = 'x1b' + 47 * ' ' client.sendto(data, (NTP_SERVER, 123)) data, address = client.recvfrom( 1024 ) if data: print 'Response received from:', address t = struct.unpack( '!12I', data )[10] t -= TIME1970 print 'tTime=%s' % time.ctime(t) if __name__ == '__main__': sntp_client() 这个攻略通过SNTP协议从网络时间服务器上获取当前时间并打印出来,如下所示: $ python 1_12_sntp_client.py Response received from: ('87.117.251.2', 123) Time=Tue Feb 25 14:49:38 2014 1.13.2 原理分析 这个SNTP客户端创建一个套接字连接,然后通过协议发送数据。从NTP服务器(这里使用的是0.uk.pool.ntp.org)收到数据后,使用struct模块取出数据。最后,减去1970年1月1日对应的时间戳,再使用Python内置的time模块提供的ctime()方法打印时间。
Python网络编程攻略——1.13 编写一个SNTP客户端
书名: Python网络编程攻略
作者: 萨卡尔
出版社: 人民邮电出版社
译者: 安道
出版年: 2014-12-1
页数: 170
定价: 45.00元
装帧: 平装
丛书: 图灵程序设计丛书
ISBN: 9787115372697