Avatar billede whynot Nybegynder
30. maj 2004 - 08:50 Der er 1 løsning

Chat program vha. INDY

Halløjsa derude..

Jeg sidder og nørkler lidt for sjov med INDY og "chat" muligheden som den tilbyder.. og jeg har nogle spørgsmål omkring disse komponenter..

1. kan det passe at indy ikke holder styr på hvor mange clients der er connectet?
2. hvis det kan lade sig gøre - hvordan pokker tilgår man dette antal, deres treads og navne fra klientens side?..

min hensigt er at lade de enkelte klienter se hvem der er på chatserveren samt at kunne lade dem skrive "privat" til hinanden.

..nedenfor er min kode for klienten.. jeg opfordrer iøvrigt alle til at anvende min kode så meget som muligt til inspiration. Fordi eksemplet som medfølger med INDY til klienten bruger en "beskridt" løkke - endda en løkke som låser programmet såfremt at .readln er "tom"... så alt i alt er eksemplet fra indy's side elendigt - i hvert tilfælde efter min mening.!

unit ClientUnit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, StdCtrls;

type
  TReadThread = class(TThread)
  public
    constructor Create(IndyClient: TIdTCPClient);
  private
    FIndyClient: TIdTCPClient;
    FMessage: String;
    procedure DisplayString;
  protected
    procedure Execute; override;
  end;

  TForm1 = class(TForm)
    IdTCPClient1: TIdTCPClient;
    Memo1: TMemo;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure IdTCPClient1Connected(Sender: TObject);
    procedure IdTCPClient1Disconnected(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  private
    tr: TReadThread;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{ TReadThread }

constructor TReadThread.Create(IndyClient: TIdTCPClient);
begin
  FIndyClient := IndyClient;
  inherited Create(false);
end;

procedure TReadThread.DisplayString;
begin
  Form1.Memo1.Lines.Add(FMessage);
end;

procedure TReadThread.Execute;
begin
  while not Terminated and FIndyClient.Connected do
  begin
    FMessage := FIndyClient.ReadLn('');
    Synchronize(DisplayString);
  end;
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  IdTCPClient1.Host := '62.243.120.105';
  IdTCPClient1.Port := strtoint(Edit3.Text);
  IdTCPClient1.Connect;
  IdTCPClient1.WriteLn(edit2.Text);
end;

procedure TForm1.IdTCPClient1Connected(Sender: TObject);
begin
  Memo1.Lines.Add('[Connected]');
  tr := TReadThread.Create(IdTCPClient1);
end;

procedure TForm1.IdTCPClient1Disconnected(Sender: TObject);
begin
  if IdTCPClient1.ClosedGracefully then
    Memo1.Lines.Add('[Disconnected gracefully]')
  else
    Memo1.Lines.Add('[Disconnected abruptly]');
  tr.Free;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if (key = #13) then
  begin
    IdTCPClient1.Writeln(Edit1.Text);
    edit1.Clear;
  end;
end;

end.
Avatar billede whynot Nybegynder
01. juni 2004 - 13:18 #1
hmmm... det er åbenbart en kompliceret ting at gøre - skørt nok.!

Anyway.. eksemplet som medfølger INDY server, Chat styrer tingene med en Tlist af records.. denne indholder én entry pr. client tråd.. dvs. at en gennemgang af denne Tlist vil give navnene på klienter... gennem tcpServerExecute eventet (som køres hvér kan en bruger sender en tekst til serveren) kan man "lave" komandoer som f.eks. List_klienter eller sådan noget.. og derefter håndtere problemet på server siden.

procedure TfrmMain.tcpServerExecute(AThread: TIdPeerThread);
var
  Client : TSimpleClient;
  Com,    // System command
  Msg    : String;
begin
  Msg    := AThread.Connection.ReadLn;
  if UpperCase(Msg) = 'hello' then AThread.Connection.WriteLn('og davs med dig'); //ved klientens indtastning af "hello" returnerer serveren "og davs med dig".
  if (UpperCase(Msg) = 'QUIT') or (UpperCase(Msg) = 'BYE') then    Athread.Connection.Disconnect; //ved klientens indtastning af "quit" eller "bye" lukker serveren for klienten til serveren.

jeg håber at dette vil hjælpe andre med lignende problem som jeg..

http://www.matlus.com/scripts/website.dll  har iøvrig en hel masse artikler omkring emnet telnet og tcp/ip.. jeg kan varmt anbefale siden.!
end;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester