Einzelnen Beitrag anzeigen

Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#1

ServerSocket + NT Service ???

  Alt 11. Aug 2008, 12:22
Moin,

ich habe eine Client/Server Anwendung. Sie funktioniert auch wunderbar. Jetzt möchte ich aber den Server als Dienst laufen lassen. Ich habe mir einen Dienst erstellt mit allen notwendigen Eigenschaften wie in der Anwendung.

Leider wird jetzt die Verbindung nicht aufgebaut und ich verstehe nicht warum. Ich hoffe ihr wisst Rat.

Mein Service für den Server:
Delphi-Quellcode:
unit uMain;

interface

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

type
  TKECServerMonitoring = class(TService)
    Timer: TTimer;
    procedure ServiceExecute(Sender: TService);
    procedure ServiceAfterInstall(Sender: TService);
    procedure ServiceBeforeUninstall(Sender: TService);
    procedure ServiceCreate(Sender: TObject);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
    procedure TimerTimer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    Client: TClientSocket;
    Server: TServerSocket;
    function GetServiceController: TServiceController; override;
  end;

var
  KECServerMonitoring: TKECServerMonitoring;

implementation

{$R *.DFM}

{##############################################################################}
{######################                        ################################}
{######################      Main Program      ################################}
{######################                        ################################}
{##############################################################################}
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  KECServerMonitoring.Controller(CtrlCode);
end;

function TKECServerMonitoring.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TKECServerMonitoring.ServiceAfterInstall(Sender: TService);
begin
//
end;

procedure TKECServerMonitoring.ServiceBeforeUninstall(Sender: TService);
begin
 Server.Active := FALSE;
end;

procedure TKECServerMonitoring.ServiceCreate(Sender: TObject);
begin
 //Initialisierung des Objekts (ältere Delphi-Versionen)
 Server := TServerSocket.Create(Self);

 // Initial Server Verbindung damit der Client Verbindung aufnehmen kann
 Server.Port := 29979;
 Server.Active := TRUE;
end;

procedure TKECServerMonitoring.ServiceStart(Sender: TService; var Started: Boolean);
begin
 Timer.Enabled := TRUE;
end;

procedure TKECServerMonitoring.ServiceExecute(Sender: TService);
begin
 while not Terminated do
 begin
   ServiceThread.ProcessRequests(TRUE); // CPU Last ist damit nicht 100%
 end;
end;

procedure TKECServerMonitoring.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  Timer.Enabled := FALSE;
end;

procedure TKECServerMonitoring.TimerTimer(Sender: TObject);
begin
 if Server.Active = FALSE then
 begin
   Server.Port := 29979;
   Server.Active := TRUE;
 end;
end;

end.
Meine Client Unit:
Delphi-Quellcode:
...
procedure Tfrm_main.FormCreate(Sender: TObject);
begin
 //Initialisierung des Objekts (ältere Delphi-Versionen)
 Client := TClientSocket.Create(Self);

 Client.OnError := ClientError;
 Client.OnConnect := ClientConnect;
end;

procedure Tfrm_main.sbtn_connectClick(Sender: TObject);
begin
 if edt_server.Text <> 'then
 begin
   try
     Client.Port := 29979;
     // Remote Computer mit dem die Verbindung aufgebaut werden soll
     Client.Host:= edt_server.Text;
     Client.Open;
   except
     //Im Fehlerfall wieder freigeben (ältere Versionen)
     Client.Free;
     end;
 end
 else
   MessageDlg('IP / Name des Remote Computer eingeben.',mtInformation,[mbOK],0);
end;

procedure Tfrm_main.ClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
 Memo.Lines.Add(FormatDateTime('hh:mm:ss',now) + ' : Verbunden mit '+edt_server.Text);
end;

procedure Tfrm_main.ClientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
 if ErrorCode > 0 then
 begin
   Client.Close;
   Memo.Lines.Add(FormatDateTime('hh:mm:ss',now) + ' : Verbindung mit '+edt_server.Text + ' fehlgeschlagen');
   ErrorCode := 0;
 end;
end;
...
  Mit Zitat antworten Zitat