Ein neuer Tag, und kaum geht man neu ausgeruht an die Sache heran, fallen einem gleich die Fehler auf
Nun funktioniert's.
Zur Erklärung: Im OnSessionAvailable wird eine neuen Instanz für die ankommende Session erzeugt
Delphi-Quellcode:
procedure Tfrm_main.ipserverSessionAvailable(Sender: TObject; ErrCode: Word);
var
mysocket: TSocket;
begin
if ErrCode <> 0
then exit;
mysocket:=ipserver.Accept;
ServerSocket:=TWSocket.Create(
nil);
//Da hier einen neue Instanz von TWSocket erzeugt wird,
//muß natürlich auch das OnDataAvailable-Ereignis zugeordnet werden,
//da sonst der Datenempfang nicht festgestell werden kann.
ServerSocket.OnDataAvailable:=ipserverDataAvailable;
ServerSocket.OnSessionClosed:=ipserverSessionClosed;
ServerSocket.OnSessionConnected:=ipserverSessionConnected;
ServerSocket.OnChangeState:=ipserverChangeState;
//LineMode,IP und Ports übernehme ich von der Komponente, die auf
//der Form liegt, da ich dort Veränderungen vornehme, wenn nötig.
ServerSocket.LineMode:=ServerSocket.LineMode;
ServerSocket.LineEnd:=ServerSocket.LineEnd;
ServerSocket.LocalAddr:=ipserver.LocalAddr;
ServerSocket.Port:=ipserver.Port;
ServerSocket.Proto:=ipserver.Proto;
ServerSocket.Dup(mysocket);
Writelog(False, '
Server Session Available: '+ServerSocket.PeerPort);
end;
dieser müssen natürlich die Ereignisse zugewiesen werden. Das war mein Denkfehler, denn ich dachte er übernimmt diese von der Komponente. Aber klar, woher denn auch. Und letztlich ist das natürlich genial, denn in Abhängigkeit der in OnSessionAvailable zur Verfügung stehenden Daten (z.B. Peer-
IP) könnte man unterschiedliche Ereignisbehandlungsroutinen und andere Eigenschaften zuweisen.
Danach empfing ich aber leider nur leere Strings.
Auch hier liegt die Erklärung wieder in der Instanz. Da ich zu Anfang die Ereignisprozeduren für OnDataAvailable nur der Komponente auf der Form zugewiesen habe, habe ich mich beim Auswerten des ReceiveStr diesen auch von dieser geholt. Richtigerweise muss man sich die aber von Sender holen, da es sich ja um einen neue Instanz handelt.
Delphi-Quellcode:
procedure Tfrm_main.ipserverDataAvailable(Sender: TObject; ErrCode: Word);
var
s: string;
begin
Writelog(False, 'Server: DataAvailable');
if ErrCode<>0 then Exit;
//Wichtig: Mit dem Sender arbeiten
s:=(Sender as TWSocket).ReceiveStr;
s:=StringReplace(s,(Sender as TWSocket).LineEnd, '', [rfReplaceAll]);
if s<>'' then
begin
//Hier den Emfangenen Text auswerten
Writelog(True, 'Empfangen: '+s);
end;
end;
Und schon funktioniert es wie gewünscht. Ich habe ein bischen gebraucht, bis dahinter kam, da der Einstieg auf Grund wenig vorhandener Dokumentation schwierig war.
Für alle die es interessiert und die das nachvollziehen wollen, hab ich mal den Source angehängt.
Vielen Danke für eure Unterstützung.