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)