Thema: Delphi Fragen zu Chat.

Einzelnen Beitrag anzeigen

NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Fragen zu Chat.

  Alt 15. Feb 2012, 22:06
Hallo,

Also wenn ich so ein ServerClient System baue, gehe ich immer so vor:

1. Wie schon jemand erwähnt eine Art Indikator, d.h. ein Wert der der Client an den Server und umgekehrt sendet, woher er weis, was er mit den einkommenden Daten machen soll.

Normalerweise deklariert man einen Type, der als Byte von Delphi umgesetzt wird und den an den Server sendet, da das Empfangen dadurch ein bischen Komplizierter wird, kann man auch einen Char (ein Zeichen) verwenden, was auch schon erwähnt wurde.

Z.B. wegen dem Passwort:

//Server
Delphi-Quellcode:

procedure TForm1.ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
var i:integer;
Nachricht,SendText :AnsiString;
begin
Nachricht:= Socket.ReceiveText;
  If Nachricht[1] = #101 then //Erstes Zeichen überprüfen und Passwort filtern
  begin
  Delete(Nachricht,1,1); //Erstes Zeichen von der Nachreicht entfernen, damit wir nur das Passwort haben.
  If Nachricht = 'Passwortthen //Bei 'Passowrt' das Passwort, das dein Vater haben möchte.
  begin
    //Wenn Passwort übereinstimmt, sende "Richtig Befehl" an client;
   SendText := #102; //Richtig
  end
  else
  begin
  SendText := #103; //Falsch
  end;
end;

end.

procedure TForm1.ServerClientConnect(Sender: TObject; Socket: TCustomWinSocket);
var Text : AnsiString;
begin
  //Die Socket Variable kann man dazu benutzen direkt mit dem Client zukomumnizieren
  Memo1.Lines.Add('Status: Client ' + Socket.RemoteAddress + ' verbunden.');
  Text := #100 //Z.B. für die Passwort abfrage
  Socket.SendText(Text);
  end;
//Client
Delphi-Quellcode:
procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var Text : AnsiString;
    SendT : AnsiString;
begin
Text := Socket.ReceiveText;
  If Text[1] = #100 then //mit Text[1] überprüfst du das erste zeichen
  begin
  //Dialog oder sonstwas anzeigen zur Passwortabfrage. Variable SendT mit dem Eingegeben Passwort füllen.
    SendT := #101 + Passwort; //Passwort ist ein Platzhalter für z.b. Edit1.Text oder ähnliches
    Socket.SendText(SendT);
  end;

Text := Socket.ReceiveText; //Antwort empfangen, es kann sein das du den grad gesendet text bekommst, bin mir nicht sicher, da ich normalerweise immer die Indy Komponenten dafür nehme.
  If Text[1] = #102 then //mit Text[1] überprüfst du das erste zeichen
  begin
  //Passwort war richtig
  end
  else
  If Text[1] = #103 then
  begin
  //Passwort war falsch
  end;

end;
Soweit für die Kommunikation zwischen den Beiden. Die Werte von mir wie #100 usw. kannst du dir anpassen wie du willst.

Wegen dem Nicknamen würde ich mit 2 StringListen( musst du selbst per Code erstellen) arbeiten, oder 2 ListBoxen.

Diese sind nur beim Server.
In der einen Schreibst du die Socket.RemoteAddress und in der anderen den Nicknamen.
Den Nicknamen für eine Adresse bekommst du dan so:
Delphi-Quellcode:
//Adressen, NicknamenList sind ListBoxen
var Nickname : String;
Nickname := NicknamenList[Adressen.IndexOf(Socket.RemoteAddress)]; //IndexOf gibt dir den Index in der Liste von Adressen, da beide gleichviele Einträge und zu jeder Adresse ein Nickname existiert, kannst du mit dem Index von Adressen, dir den Nicknamen von der Adresse ausgeben lassen.
So hoffe ich konnte dir das System ein wenig näher bringen.

Gruß
NickelM
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat