نقل قول:
من طبق گفته شما يه متغير از نوع TIdPeerThread تعريف كردم اگه ميشه بفرماييد فقط تعداد كامپيوترها زياد باشد چطوري به كامپيوتر خاص ميشه دستور فرستاد
لازم نیست که شما درست کنید، خودش درست میکنه:
هر زمان که کلاینتی به سرور وصل میشه، رویداد OnConnect از IdTPCServer فراخوانی میشه. IdTCPServer برای هر کلاینتی که بهش وصل میشه یک Thread از نوع TIdPeerThread میسازه. این Thread از طریق پارامتر AThread در رویداد OnConnect در دسترس شما هست.
برای اینکه بتونید بعدا برای کلاینت ها چیزی ارسال کنید، باید هر زمان که کلاینتی به سرور وصل میشه، اشاره گری به Thread مربوط به آن را در رویداد OnConnect ذخیره کنید و در رویداد OnDisconnect آن اشاره گر را آزاد کنید. برای این منظور می تونید از TObjectList استفاد کنید.
مثال:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPServer, Contnrs, StdCtrls;
type
TForm1 = class(TForm)
IdTCPServer1: TIdTCPServer;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure IdTCPServer1Connect(AThread: TIdPeerThread);
procedure IdTCPServer1Disconnect(AThread: TIdPeerThread);
procedure Button1Click(Sender: TObject);
private
ClientList : TObjectList;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
ClientList := TObjectList.Create(False);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ClientList.Free;
end;
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
ClientList.Add(AThread);
end;
procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
begin
ClientList.Remove(AThread);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
begin
for i := 0 to ClientList.Count-1 do
TIdPeerThread(ClientList[i]).Connection.SendCmd('MyCommand');
end;
end.