AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Users online in einem Chat
Thema durchsuchen
Ansicht
Themen-Optionen

Users online in einem Chat

Ein Thema von ArmyMan · begonnen am 3. Jul 2004 · letzter Beitrag vom 21. Jul 2004
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von ArmyMan
ArmyMan

Registriert seit: 25. Mai 2004
Ort: Wil Sg
193 Beiträge
 
#1

Users online in einem Chat

  Alt 3. Jul 2004, 21:32
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
ArmyMan
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Users online in einem Chat

  Alt 3. Jul 2004, 21:35
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von ArmyMan
ArmyMan

Registriert seit: 25. Mai 2004
Ort: Wil Sg
193 Beiträge
 
#3

Re: Users online in einem Chat

  Alt 3. Jul 2004, 21:39
Könntest du mir einen quelltext schreiben bitte. Ich habe einen riesigen knopf

Thx ArmyMan
ArmyMan
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Users online in einem Chat

  Alt 3. Jul 2004, 21:49
Moin ArmyMan,

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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#5

Re: Users online in einem Chat

  Alt 3. Jul 2004, 22:07
Zitat von ArmyMan:
Könntest du mir einen quelltext schreiben bitte.
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von ArmyMan
ArmyMan

Registriert seit: 25. Mai 2004
Ort: Wil Sg
193 Beiträge
 
#6

Re: Users online in einem Chat

  Alt 3. Jul 2004, 22:45
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
ArmyMan
Reden ist Schweigen, Silber ist Gold!
Der Soldat friert nicht. Er zittert nur vor Wut, weil es so kalt ist.
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#7

Re: Users online in einem Chat

  Alt 4. Jul 2004, 07:16
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
...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.
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von ArmyMan
ArmyMan

Registriert seit: 25. Mai 2004
Ort: Wil Sg
193 Beiträge
 
#8

Re: Users online in einem Chat

  Alt 4. Jul 2004, 11:31
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
ArmyMan
Reden ist Schweigen, Silber ist Gold!
Der Soldat friert nicht. Er zittert nur vor Wut, weil es so kalt ist.
  Mit Zitat antworten Zitat
Benutzerbild von vlees91
vlees91

Registriert seit: 19. Apr 2004
843 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Users online in einem Chat

  Alt 4. Jul 2004, 11:49
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.
vlees91
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#10

Re: Users online in einem Chat

  Alt 4. Jul 2004, 11:50
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 19:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz