Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TserverSocket zur laufzeit erzeugen mit event (https://www.delphipraxis.net/144811-tserversocket-zur-laufzeit-erzeugen-mit-event.html)

Masteric 17. Dez 2009 00:12


TserverSocket zur laufzeit erzeugen mit event
 
Hi,
ich habe ein kleines Problem, ich will in einem Programm Tserversockets mit unterschiedlichen Ports dynamisch erzeugen.
Ich habe das ganze mal in einer Testanwendung probiert nur leider funktioniert es nicht so ganz.....
Hier mal der Quelltext meiner Testanwendung:
Delphi-Quellcode:
type
  TNotifyEvent = procedure(sender : TObject) of object;

type
  TForm1 = class(TForm)
    ServerSocket1: TServerSocket;
    Button1: TButton;
    Button2: TButton;
    ClientSocket1: TClientSocket;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
    Servers : array of TServerSocket;

  public
    { Public-Deklarationen }
    procedure sockeEvent(sender : TObject; Socket: TCustomWinSocket);
  end;

var
 Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.sockeEvent(sender : TObject; Socket: TCustomWinSocket);
begin
showmessage(TServerSocket(sender).Name); <--- Einfacher test ob was ankommt!
end;

procedure TForm1.Button1Click(Sender: TObject); <--- Nur dazu da eine auf Kommando zu erzeugen.
begin
Servers[0].Create(self); <--- Hier kommt die Fehlermeldung!!
with Servers[0] do begin
 parent := self;
 name := 'SS0';
 ServerType:=stNonBlocking;
 ThreadCacheSize:=10;
 OnClientRead:=sockeEvent;
 Port:=12345;
 Active:=true;
 end;
end;
Hab mal im Quelltext die Fehlerstellen makiert. Der Fehler lautet: EAccess Violation in Projekt1.exe an der makierten Stelle.

Ich hoffe mal ihr seht mehr als ich, ich finde einfach meinen Fehler nicht.......

Gruß
Masteric

WoGe 17. Dez 2009 00:20

Re: TserverSocket zur laufzeit erzeugen mit event
 
Zitat:

Zitat von Masteric
Delphi-Quellcode:
Servers[0].Create(self); <--- Hier kommt die Fehlermeldung!!

müsste doch wohl eher solauten:
Delphi-Quellcode:
Servers[0] := TServerSocket.create
Gruss
wo

Masteric 17. Dez 2009 01:25

Re: TserverSocket zur laufzeit erzeugen mit event
 
Liste der Anhänge anzeigen (Anzahl: 1)
leider nein, da möchte er bei dem create(<-Hier noch einen Parameter haben->) und wenn ich da nil oder self einsetze kommt die selbe Fehlermeldung....

Gruß Masteric

PS: Im Anhang ist mal die exakte Fehlermeldung, falls sie hilft.

WoGe 17. Dez 2009 01:35

Re: TserverSocket zur laufzeit erzeugen mit event
 
Zitat:

Zitat von Masteric
Servers : array of TServerSocket;

ändere mal zu Servers : array[0..10] of TServerSocket;

und self sollte eigentlich richtig sein

Gruss wo

Astat 17. Dez 2009 01:53

Re: TserverSocket zur laufzeit erzeugen mit event
 
Hallo Masteric.

Versuchs mal so.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,
  ScktComp; //-- wegen TServerSocket

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    ClientSocket1: TClientSocket;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure Button2Click(Sender: TObject);
  private
    FNextPort: Word;
    FServerArray : array of TServerSocket;
    procedure ServerSocketClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocketClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocketClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    procedure ServerSocketClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FNextPort := 15000;
end;

procedure TForm1.ServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add(
    'Ein Client hat sich mit folgendem eindeutigen Socket verbunden. Socket: ' +
      inttostr(Socket.SocketHandle)
      );
end;

procedure TForm1.ServerSocketClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add(
    'Ein Client hat sich mit folgendem eindeutigen Socket abgemeldet. Socket: '+
      inttostr(Socket.SocketHandle)
      );
end;

procedure TForm1.ServerSocketClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  Memo1.Lines.Add(
    'Ein Clientverbindung mit folgendem eindeutigen Socket: ' +
      inttostr(Socket.SocketHandle) +
        ' hat einen Fehler verursacht, der socket Fehlercode:' +
          inttostr(ErrorCode)
      );
end;

procedure TForm1.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  cbRcv: integer;
  RcvBuf: array [0..32767] of Byte;
  s: string;
begin
  cbRcv := Socket.ReceiveBuf(RcvBuf[0], Length(RcvBuf));
  if (cbRcv > 0) and (Socket.SocketHandle > 0) then begin
    SetLength(s, cbRcv);
    move(RcvBuf[0], s[1], cbRcv);
    Memo1.Lines.Add('Für Client mit folgendem eindeutigen Socket: ' +
      inttostr(Socket.SocketHandle) + ' wurden ' + IntToStr(cbRcv) + ' Bytes ' +
        'mit folgenden Daten [ ' + s + ' ] empfangen'
        );
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  inc(FNextPort);
  SetLength(FServerArray, Length(FServerArray) + 1);
  FServerArray[Length(FServerArray) -1] := TServerSocket.create(nil);
  with FServerArray[Length(FServerArray) -1] do begin
    Name := 'A' + IntToStr(FNextPort);
    ServerType := stNonBlocking;
    Port := FNextPort;
    Service := '';
    OnClientConnect := ServerSocketClientConnect;
    OnClientDisconnect := ServerSocketClientDisconnect;
    OnClientError := ServerSocketClientError;
    OnClientRead := ServerSocketClientRead;
    Active := true;
  end;
end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
var
  s: string;
begin
  s := 'Hello world!';
  if Socket.SendBuf(s[1], Length(s)) <> Length(s) then
    raise exception.Create('Fehler beim Senden');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ClientSocket1.Active := true;
end;

end.

lg. Astat

Masteric 17. Dez 2009 09:34

Re: TserverSocket zur laufzeit erzeugen mit event
 
besten danke habs hinbekommen vielen vielen Dank


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz