Thema: Chat mit PM

Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#18

AW: Chat mit PM

  Alt 6. Okt 2010, 19:54
Auch wenn es auf den ersten Blick komplizierter wird, solltest du die Nachrichten als JSON verschicken.

Senden vom Client geht dann z.B. so
Delphi-Quellcode:
uses
  superobject;

{...}

var
  o : ISuperObject;
begin
  o := SO; // Struktur vorbereiten
  o.S[ 'CMD' ] := 'MSG'; // Wir wollen eine Nachricht senden
  o.S[ 'MSG' ] := 'Ich grüße euch alle'; // Die Nachricht
  // Soll es nur einem Empfänger gesendet werden, dann diese Feld füllen, sonst leer lassen
  o.S[ 'TO' ] := 'Peter'; // Der Empfänger
  ClientSocket.SendText( o.AsJSON );
end;
Der Server empfängt das dann wie folgt
Delphi-Quellcode:
uses
  superobject;

{...}

procedure ClientRead( Sender : TObject; Socket : TCustomWinSocket );
var
  r : string;
  o : ISuperObject;
  idx : integer;
begin
  // Lesen vom Client
  r := Socket.ReceiveText;
  // und daraus wieder ein JSON erzeugen
  o := SO( r );
  o.S[ 'FROM' ] := ''; // Der Server könnte jetzt noch den Benutzer einfügen
  case IndexText( o.S[ 'CMD' ], [ 'MSG', 'LOGIN' ] ) of
    0 : // MSG
      begin
        o.I[ 'COUNT' ] := 0;
        // Senden
        for idx := 0 to TServerWinSocket( Sender ).ActiveConnections - 1 do
          // an alle?
          if ( ( o.[ 'TO' ] = '' ) or
            // an diesen Benutzer?
            ( o.S[ 'TO' ] = <Deine Userabfrage> ) ) and
            // nicht an den Client der gerade sendet
            ( Socket <> TServerWinSocket( Sender ).Connections[ idx ] ) then
            begin
              TServerWinSocket( Sender ).Connections[ idx ].SendText( o.AsJSON );
              o.I[ 'COUNT' ] := o.I[ 'COUNT' ] + 1;
            end;
         // Und wieder zurück an den Client
         Socket.SendText( o.AsJSON );
      end;
    1 : // LOGIN
      begin
        // hier werden die Login-Daten überprüft
        o.B[ 'SUCCESS' ] := PruefeLogin( o.S[ 'USER' ], o.S[ 'PASS' ] );
        // Eintrag im Usermanager
        {...}
        // Rückmeldung an den Client
        Socket.SendText( o.AsJSON );
      end;
  end;
end;
btw: Um mit TServerSocket und TClientSocket auch Unicode (UTF8) zu versenden kann man einfach diese Unit mit einbinden. (D2010 tested)
Delphi-Quellcode:
unit insCustomWinSockEncoder;

interface

uses
  ScktComp;

type
  // Erlaubt dem Socket Unicode zu senden
  TCustomWinSocketEncoder = class helper for TCustomWinSocket
    function ReceiveText : string;
    function SendText( const S : string ) : integer;
  end;

implementation

uses
  SysUtils;

{ TCustomWinSocketEncoder }

function TCustomWinSocketEncoder.ReceiveText : string;
  var
    Encoding : TEncoding;
    Buffer : TBytes;
  begin
    SetLength( Buffer, ReceiveBuf( Pointer( nil )^, -1 ) );
    SetLength( Buffer, ReceiveBuf( Pointer( Buffer )^, Length( Buffer ) ) );
    Encoding := TEncoding.UTF8;
    Result := Encoding.GetString( Buffer );
    SetLength( Buffer, 0 );
  end;

function TCustomWinSocketEncoder.SendText( const S : string ) : integer;
  var
    Encoding : TEncoding;
    Buffer : TBytes;
  begin
    Encoding := TEncoding.UTF8;
    Buffer := Encoding.GetBytes( S );
    Result := SendBuf( Pointer( Buffer )^, Length( Buffer ) );
    SetLength( Buffer, 0 );
  end;

end.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 6. Okt 2010 um 20:10 Uhr)
  Mit Zitat antworten Zitat