在程序启动的时候,自动修改客户机的时间与服务器时间保持一致,如何实现?
请给出代码!谢谢

解决方案 »

  1.   

    使用INdy里的IdTime and IDTimeServer,我以前写了一个,很Easy的,还有用到设置系统时间,其他没有了。这样是不需要权限的。用Net Timer就有限制了。
    也可以用Socket。方法多多啊。
      

  2.   

    给你一段Client的代码,Server端的你自己设置下,就Ok了,Socket设置为37
    {***************************************************************
     *
     * Project  : TimeDemo
     * Unit Name: Main
     * Purpose  : Demonstrates a DateTime client getting current date and time from remote DateTimeServer
     * Date  : 21/01/2001  -  12:55:37
     * History  :
     *
     ****************************************************************}unit Main;// A list of time servers is available at:
    // http://www.eecis.udel.edu/~mills/ntp/servers.htmlinterfaceuses
      {$IFDEF Linux}
      QGraphics, QControls, QForms, QDialogs, QStdCtrls,Classes,
      {$ELSE}
      windows, messages, graphics, controls, forms, dialogs, stdctrls,
      {$ENDIF}
      SysUtils, Classes, IdComponent, IdTCPConnection, IdTCPClient, IdTime,
      IdBaseComponent, ExtCtrls,Inifiles;type
      TfrmTimeClients = class(TForm)
      lblTimeServer: TLabel;
        IdClientTime: TIdTime;
      edtTimeResult: TEdit;
      Label1: TLabel;
      btnGetTime: TButton;
      cmboTimeServer: TComboBox;
        Timer1: TTimer;
        Button1: TButton;
      procedure btnGetTimeClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
      procedure GetTimerServer;
      procedure ReadTimerServer;
      procedure WriteTimerServer;
      Procedure SynchLocalTime;
      public
      ServerIP,DefaultName:string;
      Flag:Boolean;
      SystemTime:TSystemTime;
      LocalTime,ServerTime:TDateTime;
      end;Const FileName='TIPS.ini';
    var
      frmTimeClients: TfrmTimeClients;implementation
    {$IFDEF MSWINDOWS}{$R *.dfm}{$ELSE}{$R *.xfm}{$ENDIF}// No real code required - all functionality built into component !
    procedure TfrmTimeClients.btnGetTimeClick(Sender: TObject);
    begin  if not Flag then ReadTimerServer;
      if  ServerIP <> '' then   IdClientTime.Host := ServerIP
      else
      begin
      ShowMessage('Please deploy yours configure !');
      Exit;
      end;
      { After setting Host, this is all you have to get the time from a time
      server.  We do the rest. }
    try
      edtTimeResult.Text := DateTimeToStr ( IdClientTime.DateTime );
      ServerTime:=IdClientTime.DateTime;
      SynchLocalTime;
      Timer1.Enabled :=True;
      Flag:=True;
    except
      on E: Exception do
      begin
      Timer1.Enabled :=False;
      Flag:=False;
      ShowMessage('Checking Timer Server!');
      end;
    end;
    end;procedure TfrmTimeClients.GetTimerServer;
    var f:TIniFile;
        s:TStringList;
    begin
       s:=TStringList.Create;   f:=TIniFile.Create(ExtractFilePath(Application.ExeName)+FileName);
       f.ReadSection('Server',s);
       DefaultName:=f.ReadString('DEFAULT','Server','127.0.0.1');
       ServerIP:=F.ReadString('Server',DefaultName,'');   Flag:=F.ReadBool('auto','autoSync',False);
       if flag then
       begin
       Timer1.Interval:=F.ReadInteger('Timer','Interval',5000);
       Timer1.Enabled:=Flag;
       end;
       cmboTimeServer.Items.Clear;
       cmboTimeServer.Text:=DefaultName;
       cmboTimeServer.Items:=s;
       s.Free;
       f.Free;
    end;procedure TfrmTimeClients.FormCreate(Sender: TObject);
    begin
    GetTimerServer;
    end;procedure TfrmTimeClients.ReadTimerServer;
    var f:TIniFile;
        s:TStringList;
    begin
        s:=TStringList.Create ;
        F:=TIniFile.Create(ExtractFilePath(Application.ExeName)+FileName);
        ServerIP:=F.ReadString('Server',cmboTimeServer.Text,'');
        F.Free;end;procedure TfrmTimeClients.WriteTimerServer;
    var F:TIniFile;
    begin
        F:=TIniFile.Create(ExtractFilePath(Application.ExeName)+FileName);
        F.WriteString('DEFAULT','Server',cmboTimeServer.Text);
    {    if Timer1.Enabled then
        begin
        f.WriteBool('auto','autoSync',True);
        end
        else
        f.WriteBool('auto','autoSync',False);
    }
    end;procedure TfrmTimeClients.Timer1Timer(Sender: TObject);
    begin
    btnGetTime.Click();
    end;procedure TfrmTimeClients.SynchLocalTime;
    begin//LocalTime:=StrtoDatetime(edtTimeResult.Text);
    DateTimetoSystemTime(ServerTime,SystemTime);
    setLocalTime(SystemTime);
    GetLocalTIme(SystemTime);
    LocalTime:=SystemtimetoDatetime(SystemTIme);
    //label2.Caption :=DatetimetoStr(LocalTime);
    end;procedure TfrmTimeClients.Button1Click(Sender: TObject);
    begin
    SynchLocalTime;
    end;procedure TfrmTimeClients.FormDestroy(Sender: TObject);
    begin
    WriteTimerServer;
    end;end.