Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi ClientSocket und IRC (https://www.delphipraxis.net/42108-clientsocket-und-irc.html)

Roki_ 13. Mär 2005 21:18


ClientSocket und IRC
 
Hallo,

ich bin gerade dabei eine Bouncer Control zu schreiben, ist also zuvergleichen mit einem IRC-Client.
Zum Kommunizieren wird ClientSocket verwendet.

Nun ist das problem beim OnRead bekomm ich mehr als eine Zeile gesendet, d.H. wenn 2 Join events in einem ankommenden String sind, dann phrase ich nur den 1. Channel raus...

Delphi-Quellcode:
if pos('JOIN', sData) <> 0 then
begin
 delete(sData,1,pos('JOIN', sData)+5);
 chan := copy(sData,1,pos(#$D,sData)-1);
 Listbox1.Items.add(chan);
end;
wie lös ich das problem?

Mit freundlichen Grüßen
Roki

Muetze1 13. Mär 2005 21:54

Re: ClientSocket und IRC
 
Moin!

Nach jedem JOIN kommt ein LF, oder? Warum weist du nicht einfach den empfangenen String einer TStringList.Text zu und untersuchst dann nacheinander ihre Items[]...??

MfG
Muetze1

Roki_ 13. Mär 2005 22:06

Re: ClientSocket und IRC
 
weil ich damit noch nicht gearbeitet habe und nich weiss, was es ist :)
ich schau, dass ich mich schlau mache..

und was ist ein LF? - CRLF? Ja!

//€
Also ich bekomms mit Stringlist nicht so recht hin.. wie hättest du es dir denn vorgestellt?

cu Roki

Muetze1 14. Mär 2005 02:05

Re: ClientSocket und IRC
 
Moin!

CR = Carriage Return - also Cursor zurück zum Anfang der Zeile
LF = Line Feed - also eine Zeile vorrücken.

Zusammen ergibt das dann einen Zeilenvorschub und der Cursor steht in dieser neuen Zeile ganz links...

Und wie ich es mir vorstelle:

Delphi-Quellcode:
Procedure ClientsocketRead...
Var
  lSL : TStrings;
  i : Integer;
  lData : String;
Begin
  lSL := TStringList.Create;
  Try
    lSL.Text := Socket.ReceiveText;  // die StringList teilt das auf in die Zeilen
   
    For i := 0 To lSL.Count-1 Do     // nun die Zeilen nacheinander durchgehen und jeweils drum kümmern...
    Begin
      lData := lSL[i];

      If ( Pos('JOIN', lData) > 0 ) Then
      Begin
        Delete(lData, 1, Pos('JOIN', lData)+5);
        ListBox1.Items.Add(lData);   // Chan unnötig, da nach dem Delete() lData nur noch den Chan enthalten kann...
      End;
    End;
  Finally
    lSL.Free;
  End;
End;
Sowas in der Richtung. Keine Garantie das es auf Anhieb läuft, ist ebend mal so aus'm Hirn gequetscht...

Wichtig! ReceiveText() des Socket gibt keine Sicherheit das immer komplette Zeilen ankommen! Es ist sehr gut möglich das dein OnClientRead mehrfach aufgerufen wird, bevor du überhaupt eine komplette Zeile empfangen hast. Es kann also gut sein, das du ein "JOIN" empfängst, aber der Channelname der dahinter kommt, den bekommste erst beim nächsten Aufruf von OnClientRead! Darauf will ich noch hinweisen...

MfG
Muetze1

Pseudemys Nelsoni 14. Mär 2005 02:27

Re: ClientSocket und IRC
 
du könntest das ganze auch parsen...
erstmal ersetzt du alle #13 durch #10 in deinem string, dann löscht du doppelte #10er (sofern vorhanden, nicht alle server senden beides) und dann führst du den string in einer schleife aus, bis dieser leer ist...das ganze sieht dann ca so aus:

command1#10command2#10command3#10command4#10...

also kopierst du bis #10 -1 und löscht bis #10.

so ca:

Delphi-Quellcode:
    { Alle #13er durch #10er ersetzen und doppelte #10er löschen(sofern vorhanden). }
    ConArray[i].Queue := ConArray[i].Queue + ReceiveText;
    while pos(#13, ConArray[i].Queue) <> 0 do
      ConArray[i].Queue[pos(#13, ConArray[i].Queue)] := #10;
    while pos(#10#10, ConArray[i].Queue) <> 0 do
      delete(ConArray[i].Queue, pos(#10#10, ConArray[i].Queue), 1);
    { Alle Befehle aus der Queue verarbeiten }
    while pos(#10, ConArray[i].Queue) <> 0 do
    begin
      case IdxArrStr(CommandArray, GetTok(s, 1, #32)) of
        0: {JOIN}
          begin
            // Do Something
          end;
        1: {PART}
          begin
          end;
      end;
      Delete(ConArray[i].Queue, pos(#10, ConArray[i].Queue));
    end;

Hab damals viel mit irc gemacht =)

BTW: ich finds gut das du keine fertige kompos nimmst, sowas sieht man hier leider selten :\

Roki_ 14. Mär 2005 11:40

Re: ClientSocket und IRC
 
Vielen Dank!

Dein Code klingt ja relativ plausibel :)

Ich werde es heut Nachmittag ausprobieren, bin aber zuverlässig, dass es funktioniert...


cu Roki

Pseudemys Nelsoni 14. Mär 2005 11:46

Re: ClientSocket und IRC
 
Wenn was nicht klappt kannste mir ruhig ne PM senden, dann helf ich gern weiter =)

Muetze1 14. Mär 2005 13:42

Re: ClientSocket und IRC
 
Moin!

Zitat:

Zitat von Roki_
Vielen Dank!

Dein Code klingt ja relativ plausibel :)

Ich werde es heut Nachmittag ausprobieren, bin aber zuverlässig, dass es funktioniert...


cu Roki

Nur das die TStringList das automatisch macht und kein Problem mit den $13, $10 bzw. $10, $13 oder nur $13 hat. Daher ist es eine Frage wie kompliziert man es sich machen will ...

MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 Uhr.

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