![]() |
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 |
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. |
Re: Users online in einem Chat
Könntest du mir einen quelltext schreiben bitte. Ich habe einen riesigen knopf :drunken:
Thx ArmyMan |
Re: Users online in einem Chat
Moin ArmyMan,
Zitat:
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. |
Re: Users online in einem Chat
:warn:
Zitat:
Zitat:
|
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:
Client:
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.
Delphi-Quellcode:
Wo kann ich dass mit dem Info senden einfügen?
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. ArmyMan |
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:
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.
...SendText(IntToStr(TEXT)+cDelimiter+strText);
Fürs An/Abmelden eines Users könnte alles dann wie folgt aussehen:
Delphi-Quellcode:
Das kommt in jene Routine rein, wo ein User beim Server hinzugefügt bzw. gelöscht wird.
...SendText(IntToStr(LOGON)+cDelimiter+strUsername);
...SendText(IntToStr(LOGOFF)+cDelimiter+strUsername); 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. |
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 |
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. |
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. |
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