Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Users online in einem Chat (https://www.delphipraxis.net/25267-users-online-einem-chat.html)

ArmyMan 3. Jul 2004 20:32


Users online in einem Chat
 
Hallo zusammen

Ich habe ein problem.
Ich versuche schon ewig lang, einen chat zu programmieren wo man sieht wer online ist.
Ich muss nur dass mit dem online haben, nicht das man jedem einzeln schreiben kann. Es wird immer allen teilnehmern geschrieben.

Bitte helft mir, Danke

ArmyMan

Christian Seehase 3. Jul 2004 20:35

Re: Users online in einem Chat
 
Moin ArmyMan,

nur mal so als Idee:
Wenn der Chat mit Server und Client arbeitet, müsstet Du, vom Server aus, nur jede An-/Abmeldung an jeden angemeldeten Client weiterschicken.

ArmyMan 3. Jul 2004 20:39

Re: Users online in einem Chat
 
Könntest du mir einen quelltext schreiben bitte. Ich habe einen riesigen knopf :drunken:

Thx ArmyMan

Christian Seehase 3. Jul 2004 20:49

Re: Users online in einem Chat
 
Moin ArmyMan,

Zitat:

Zitat von ArmyMan
Es wird immer allen teilnehmern geschrieben.

das hast Du doch schon geschrieben.
Du musst lediglich eine Kennung (Kommando) mit übertragen, dass es sich nicht um einen Chattext handelt, sondern um eine Info, in diesem Falle also einen Zu-/Abgang bei den Teilnehmern.

Phoenix 3. Jul 2004 21:07

Re: Users online in einem Chat
 
:warn:
Zitat:

Zitat von ArmyMan
Könntest du mir einen quelltext schreiben bitte.

Zitat:

Zitat von Verhaltenskodex der DP
2.3.2.3 - Null Bock? Nicht hier.

Mit Fragen, die sich lesen wie "...ich habe weder Ahnung noch Lust, kann mir mal einer mein Programm schreiben..." wirst Du hier nicht auf Gegenliebe stoßen. Wir sind gerne bereit, jedem zu helfen, der selber Engagement zeigt - aber wir machen nicht die Hausaufgaben Anderer.
Zudem ist es unerläßlich, daß Du Dich selber mit dem Problem befasst hast, bevor Du in der Lage bist, dazu eine präzise Frage zu stellen.
Etwas völlig Anderes ist es natürlich, wenn Du (noch) nicht weißt, wonach Du suchen sollst, bzw. wo Du anfangen sollst. Dann frage gerne nach geeigneten Stichworten.


ArmyMan 3. Jul 2004 21:45

Re: Users online in einem Chat
 
Sorry, es ist nicht dass ich kein bock habe, aber ich weiss nicht wie es geht.

Server:
Delphi-Quellcode:
unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdIPWatch, ScktComp, StdCtrls,
  ExtCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    ServerSocket1: TServerSocket;
    IdIPWatch1: TIdIPWatch;
    lblip: TLabel;
    Panel1: TPanel;
    ListBox1: TListBox;
    Edit1: TEdit;
    Button1: TButton;
    ClientSocket1: TClientSocket;
    ListBox2: TListBox;
    procedure FormActivate(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure ServerSocket1ClientDisconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientConnect(Sender: TObject;
      Socket: TCustomWinSocket);
    function GetToken(aString, SepChar: string; TokenNum: Byte): string;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);
begin
lblip.Caption := IdIPWatch1.LocalIP;
clientsocket1.Host := IdIPWatch1.LocalIP;
clientsocket1.Active := true;
end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var i :integer;
    Text:string;
    nickname: string;
    message: string;
begin
Text:=Socket.ReceiveText;
nickname := (Trim(GetToken(Text,': ',1)));
message := (Trim(GetToken(Text,': ',2)));
begin
 Memo1.Lines.add(Timetostr(now) + ': '+ nickname + ': ' + message);
  For I := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
   begin
   with ServerSocket1.Socket.Connections [I] do
  if (Connected) then SendText(nickname + ': ' + message);
 end;
end;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
serversocket1.Close;
memo1.Lines.SaveToFile('chat-log.txt');
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
ListBox1.Items.Delete(ListBox1.Items.IndexOf(Socket.RemoteAddress+'('+Socket.RemoteHost+')'));
end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
var nickname: string;
    text: string;
begin
Text := Socket.ReceiveText;
nickname := (Trim(GetToken(Text,': ',1)));
ListBox1.Items.Add(Socket.RemoteAddress + nickname);
end;

function TForm1.GetToken(aString, SepChar: string; TokenNum: Byte): string;
var
  Token: string;
  StrLen: Byte;
  Num: Byte;
  EndofToken: Byte;
begin
  StrLen    := Length(aString);
  Num       := 1;
  EndofToken := StrLen;
  while ((Num <= TokenNum) and (EndofToken <> 0)) do
  begin
    EndofToken := Pos(SepChar, aString);
    if EndofToken <> 0 then
    begin
      Token := Copy(aString, 1, EndofToken - 1);
      Delete(aString, 1, EndofToken);
      Inc(Num);
    end
    else
      Token := aString;
  end;
  if Num >= TokenNum then
    Result := Token
  else
    Result := '';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if (clientsocket1.Active = true) and (edit1.Text <> '')
then clientsocket1.Socket.SendText('console: ' + edit1.Text);
edit1.Clear;
edit1.SetFocus;
end;

end.
Client:
Delphi-Quellcode:
implementation

uses mainemail;

{$R *.dfm}

procedure TTDP_MultiTool.delay(time: word);
var start: integer;
begin
  start := GetTickCount;
  while (GetTickCount)-(Start) <= time do
  application.ProcessMessages;
end;

procedure TTDP_MultiTool.lblcloseClick(Sender: TObject);
begin
close;
end;

procedure TTDP_MultiTool.editmessageChange(Sender: TObject);
begin
if editmessage.Text = ''
then btnsend.Enabled := false
else btnsend.Enabled := true;
if memochat.Modified
then tab1.ActivePage := 'Chat';
end;

procedure TTDP_MultiTool.btnloginClick(Sender: TObject);
begin
clientsocket1.Open;
delay(2000);
if clientsocket1.Active
then
  btnlogoff.BringToFront
else
  begin
  clientsocket1.Close;
  lbonline.Clear;
  application.MessageBox('Server not online', 'Error', 0+64);
  end;
end;

procedure TTDP_MultiTool.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
clientsocket1.Socket.SendText(lblusername.caption + ' has logged on');
editmessage.Enabled := true;
editmessage.SetFocus;
end;

procedure TTDP_MultiTool.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
btnlogoff.Click;
end;

procedure TTDP_MultiTool.btnlogoffClick(Sender: TObject);
begin
clientsocket1.Socket.SendText(lblusername.caption + ' has logged off');
delay(500);
clientsocket1.Close;
btnlogin.BringToFront;
end;

procedure TTDP_MultiTool.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
begin
memochat.Lines.Add(socket.ReceiveText);
end;

procedure TTDP_MultiTool.btnsendClick(Sender: TObject);
begin
if clientsocket1.Active
then
  begin
  editmessage.SetFocus;
  clientsocket1.Socket.SendText(lblusername.caption + ': ' + editmessage.Text);
  editmessage.Clear;
  editmessage.SetFocus;
  end
else
  btnlogin.SetFocusl
end;

procedure TTDP_MultiTool.ClientSocket1Disconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
lbonline.Clear;
editmessage.Enabled := false;
end;

end.
Wo kann ich dass mit dem Info senden einfügen?

ArmyMan

alcaeus 4. Jul 2004 06:16

Re: Users online in einem Chat
 
Ok, nachdem ich diesen Thread auch endlich gefunden habe, kann ich dir weiterhelfen.
Ich habe in meinem Chat Konstanten definiert, mit welchen festgestellt werden kann, was zur Zeit passiert. Dies muss dan alles mit Hilfe von Trennzeichen wieder aufgespaltet werden.

Für einen Text sieht das dann ungefähr so aus:
Wichtig: Die Codes sind nicht Copy-Paste-Codes :!:
Delphi-Quellcode:
...SendText(IntToStr(TEXT)+cDelimiter+strText);
TEXT ist die Konstante, die bedeutet, dass ein Text folgt. cDelimiter ist die Konstante für das Trennzeichen und strText ist der Text der gesendet wird.

Fürs An/Abmelden eines Users könnte alles dann wie folgt aussehen:
Delphi-Quellcode:
...SendText(IntToStr(LOGON)+cDelimiter+strUsername);
...SendText(IntToStr(LOGOFF)+cDelimiter+strUsername);
Das kommt in jene Routine rein, wo ein User beim Server hinzugefügt bzw. gelöscht wird.

Ein Problem hast du nun aber noch. Wenn sich ein neuer Client anmeldet, dann muss dieser auch erfahren, wer bereits im Chat ist. Ich habe das Problem so gelöst. Sobald sich ein Client anmeldet, wird dem Benutzer eine Nachricht geschickt (mit einer Konstante wie oben), damit er weiß dass die Userliste kommt. Anschließend wird mit einer while-Schleife das User-Array abgegangen und Stück für Stück dem User gesendet. Du kannst dies auch anders lösen, indem du die User auf einmal sendest, aber das bleibt dir überlassen. Anschließend wird das Abschlusskommando gesendet, und dabei zur Kontrolle auch die Userzahl mitgegeben.

Ich hoffe ich habe dir irgendwie geholfen, wenn nicht dann frag nur.

Greetz
alcaeus

PS: Poste langen Code bitte nicht in den Beitrag, sondern als Dateien.

ArmyMan 4. Jul 2004 10:31

Re: Users online in einem Chat
 
Tut mir leid. Aber jetzt komm ich noch weniger draus.
Ich dachte ich machs so:

Wenn ein neuer client anmeldet, schickt es die ganze user liste an alle clients. Also wenn sich einen client anmeldet, copiert es die ganze listbox und schick sie zur listbox von dem client. Geht dass überhaupt??

Danke für deine hilfe

ArmyMan

vlees91 4. Jul 2004 10:49

Re: Users online in einem Chat
 
Hi,

ich hab letztens einen chat geschrieben (mit den WinSockets) (in freeware).
da wird bei jeder anmeldung das handle vom client gespeichert und wenn jemand etwas schreibt, wird automatisch das handle mitgeschickt und man kann kontrollieren, wer es war (ich hab die handles in einem array gespeichert)
in einem anderen array speichert man die nicks und wenn jetzt der user mit dem handle "123456" etwas schreibt wird mit einer schleife das handle "123456" im handle-array gesucht und die stelle(id), an der das handle in dem array steht, muss dann wieder im nick-array gesucht werden.
z.B. HAndle:123456
handle-array:hat die 3. stelle(also hat sich als viertes angemeldet(0 zählt auch))
suche im nick-array bei stelle 3:dort steht z.b. Max Mustermann.

alcaeus 4. Jul 2004 10:50

Re: Users online in einem Chat
 
Naja, knapp daneben ist auch vorbei.
Wenn ein Client sich anmeldet, so schickt der Server dem neu angemeldeten Client die gesamte Userliste (der neue Client ist darin noch nicht enthalten).
Anschließend schickt der Server den Namen (und evtl. auch weitere Daten) and alle Clients, die dann die Meldung ausgeben "xy hat den Chat betreten." Dasselbe geschieht auch beim neuesten Client, aber das könntest du u.U. auch ausblenden. IMHO geht es so aber am einfachsten.

Greetz
alcaeus


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:08 Uhr.
Seite 1 von 3  1 23      

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