AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Chat mit PM

Ein Thema von hans ditter · begonnen am 3. Okt 2010 · letzter Beitrag vom 10. Okt 2010
Antwort Antwort
Benutzerbild von Sir Rufo
Sir Rufo

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

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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 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