200大分--如何通过网络校时?(200分)

  • 主题发起人 主题发起人 boyuanus
  • 开始时间 开始时间
B

boyuanus

Unregistered / Unconfirmed
GUEST, unregistred user!
我看到一些软件可以进行网络校时,请问各位大虾有没有思路和可以借鉴的代码?
如果完整解决此问题,200分送上

小弟在此先行谢过了![:D]
 
有什么必要??
关键就是找一个server 提供时间,不过好像国内没听说,老外得到是有
嗬嗬,找找吧,既的cakk 作过,找到时间啦什么都简单啦。
 
win2000本身就有这个功能!网线和服务器一连就OK了
 
服务器端不停地发时间的命令,
然后客户端去取,不就有校时了吗?
 
关键是服务器,你总不能 自己的机器连接自己的服务器吧。
 
如果win2000加入域的话会自动和域服务器同步,当然你也可以把那个服务去掉,好像是
windows time服务,
如果不使用域的话可以使用ntp协议或者sntp协议,我这里有VC和pascal原代码,要的话和我
联系
 
ME TOO:misxjq@sina.com谢谢了!
 
找个internet授时服务器,(可以试试国家授时中心时间服务器:159.226.154.47)
通过Udp协议去连接13端口,可以获得时间编码格式为:
< YYYY MM DD HH MM SS MMM L NTSC-UTC XXXXX

ASCII字符 "<"是时间标记码

YYYY MM DD HH MM SS MMM
年 月 日 时 分 秒 毫秒

L为1,表示一个正闰秒将会在本月末被加上,即这一月最后一秒是第60秒,L为2,表本
月末将会有一个负闰秒。为0表示本月没有闰秒

NTSC-UTC表示服务器所发出的时间编码为国家授时中心所保持的UTC时间

XXXXX为保留位

最后加上回车换行符

用户向服务器要求时间编码时,可首先记下本机时间T1,向服务器发送ASCII码字符串
“>XXX.XXX.XXX.XXX”,即标记码“>”加用户计算机IP地址,服务器收到后,得出此
刻时间编码,发送给用户,用户收到服务器发来的时间标记码“<”后,记下时刻T2,
随后解出服务器时间编码T3,忽略服务器耗时,服务器与用户计算机时差为T3-(T1+T2)/2,
用户调整计算机时间,时间服务完成。

 
本人写的代码,供参考:
{******************************************************************************}
{ 本程序利用ClientSocket连接到提供“格林尼制标准时间”服务的时间服务器取得标}
{准时间,在“ClientSocket1Read”中,作者只对从“Time.nist.gov”接收到的数据进行}
{了处理,每个Time Server返回的数据格式不同,使用者可以自行分析其他Time Server返}
{回的数据 }
{******************************************************************************}
unit uAdjustTime;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ScktComp, ExtCtrls;

const
arrAddress:array[0..3] of string=('192.43.244.18', // Time.nist.gov(NIST物理学实验室)
'192.5.41.40', // tick.usno.navy.mil(美国海军天文台)
'192.48.153.80', // Clock.sgi.com(SGI)
'18.145.0.30'); // Tick.mit.edu(麻省理工学院)
type
TfrmAdjustTime = class(TForm)
ClientSocket1: TClientSocket;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
ComboBox1: TComboBox;
Edit1: TEdit;
Edit2: TEdit;
Bevel1: TBevel;
Button1: TButton;
Panel1: TPanel;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Lookup(Sender: TObject;
Socket: TCustomWinSocket);
procedure ComboBox1Change(Sender: TObject);
procedure ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
procedure AppException(Sender: TObject; E: Exception);
public
{ Public declarations }
end;

var
frmAdjustTime: TfrmAdjustTime;
ServerAddress: string;
ConNum: integer;

implementation

{$R *.DFM}

//向选定的地址连接
procedure TfrmAdjustTime.Button1Click(Sender: TObject);
begin
ConNum := ConNum + 1;
if ConNum > 1 then Memo1.Lines.Add('-------------------------------------------------------------');
ClientSocket1.Close;
ClientSocket1.Address := ServerAddress;
ClientSocket1.Port := 13;
try
ClientSocket1.Open;
except
on E: ESocketError do Memo1.Lines.Add('Can not connect to Time Server!');
end;
end;

//分析接收到的消息
procedure TfrmAdjustTime.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
strTime: string;
StandardTime, BeijingTime, DTime: TDateTime;
SysTime: TSystemTime;
begin
strTime := Socket.ReceiveText; // 取得格林尼治时间;
strTime := Copy(strTime, 8, 17); // 取得日期时间部分;
if Length(strTime) = 17 then strTime := '20' + strTime; // 年份转换为四位;
DTime := EncodeTime(8, 0, 0, 0); // 时差
StandardTime := StrToDateTime(strTime); //标准时间
BeijingTime := StandardTime + DTime; // 北京时间
Edit1.Text := DateTimeToStr(StandardTime);
Edit2.Text := DateTimeToStr(BeijingTime);
DateTimeToSystemTime(StandardTime, SysTime);
SetSystemTime(SysTime); //修正本机系统时间
Memo1.Lines.Add('Adjust time successful!');
end;

//错误处理
procedure TfrmAdjustTime.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
Memo1.Lines.Add(IntToStr(ErrorCode));
case ErrorEvent of
eeGeneral: Memo1.Lines.Add('The socket received an error message that does not fit into any of the following categories.');
eeSend: Memo1.Lines.Add('An error occurred when trying to write to the socket connection.');
eeReceive: Memo1.Lines.Add('An error occurred when trying to read from the socket connection.');
eeConnect: Memo1.Lines.Add('A connection request that was already accepted could not be completed.');
eeDisconnect: Memo1.Lines.Add('An error occurred when trying to close a connection.');
eeAccept: Memo1.Lines.Add('A problem occurred when trying to accept a client connection request.');
end;
ErrorCode := 0;
ClientSocket1.Close;
end;

//正在连接
procedure TfrmAdjustTime.ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.Add('Connectting......');
end;

//连接成功
procedure TfrmAdjustTime.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.Add('Connected!');
end;

//解析服务器地址
procedure TfrmAdjustTime.ClientSocket1Lookup(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.Add('Search Time Server......');
end;

//确定服务器IP地址
procedure TfrmAdjustTime.ComboBox1Change(Sender: TObject);
begin
Button1.Enabled := ComboBox1.Text <> '';
if ComboBox1.Text <> ''
then Serveraddress:=arrAddress[ComboBox1.ItemIndex];
end;

//断开连接
procedure TfrmAdjustTime.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Memo1.Lines.Add('Disconnection!');
end;

//初始化
procedure TfrmAdjustTime.FormCreate(Sender: TObject);
begin
Application.OnException := AppException;
ConNum := 0;
end;

//异常处理
procedure TfrmAdjustTime.AppException(Sender: TObject; E: Exception);
begin
Memo1.Lines.Add(E.Message);
if E is ESocketError then Memo1.Lines.Add('Can not connect to Time Server!');
ClientSocket1.Close;
end;

//关闭
procedure TfrmAdjustTime.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
ClientSocket1.Close;
ClientSocket1.Destroy;
end;


end.
 
watter,

我用你的代码,发现点击Button1后,提示"connected!",但是始终没有执行到clientSocket1Read
不知道是什么原因
可否解释一下
多谢!
 
直接ping他的IP,看一下你的网络状况如何,可能是你的网速很慢;
我这里是正常的。
 
watter,

我在公司里可以连通,但是现在又有问题了,出现错误,提示
'2002-12-25 02:11:38' is not a valid date and time
执行到这一行代码出错:
StandardTime := StrToDateTime(strTime);

你那里有没有这种情况?
我用的是D5, 会不会是D5的问题?
我现在在查看看能不能解决
 
'2002-12-25 02:11:38' is not a valid date and time
是说明'2002-12-25 02:11:38'不符合日期时间型数据的格式,所以StrToDateTime函数无法正确执行;
仔细检查截取字符串时位置是否正确,检查一下前面或后面是否有多余的空格,
可以这样:StrToDateTime(Trim(strDateTime));
我这里一切正常,没有问题的。
 
菜鸟求救!

我的Delphi7.0上怎么找不到ServerSocket、ClientSocket呀??
 
to jamers:
Delphi7.0好象已经不用这两个控件了,换别的吧,都差不多。
 
to watter:

那需要换什么控件?
我是刚从VB转到Delphi里的,还有很多不明白的地方,希望你们多多指点。
 
to:dclsockets70.bpl 安装这个包,就行了在DELPHI7的BIN目录下
 
对不起,我没有用过7.0
 
to boyuanus
我想应该是你的系统的日期分隔符不是“-”,而是“/”才会不正确的,
如果你在控制面板中修改过来,就应该对了
 
to watter:
喔,不过还是谢谢你!
 
后退
顶部