PDA

View Full Version : فرستادن پيام از سرور به كلاينت در Indy



Little Robot
پنج شنبه 29 اسفند 1387, 12:20 عصر
سلام
با Indy 9 تو Delphi 7 چجوري از سرور (IdTcpServer) كه همه ي كلاينت ها بهش وصلن يه پيام به يكي از كلاينت بفرستيم؟؟! اون چجوري پيامو دريافت كنه؟؟! :لبخند:

vcldeveloper
پنج شنبه 29 اسفند 1387, 13:17 عصر
سرور سرویس دهنده هست، یعنی به درخواست های کلاینت ها پاسخ میده. هر زمان سرور درخواستی از کلاینت دریافت کنه، رویدادهای مربوط به آن، مثل OnExecute فراخوانی میشند، و سرور میتونه پاسخ درخواست را از طریق پارامترهای این رویدادها به کلاینت ارسال بکنه.
اگر قرار هست دو سیستم هم برای هم درخواست بفرستند، هم به درخواست هم پاسخ بدند، می تونید در هر دو سمت یک IdTCPServer و IdTCPClient قرار بدید.

اگر فقط در برخی مواقع خاص می خواید این پیام ارسال بشه، می تونید لیستی از Threadهای مربوط به هر کلاینت که در زمان Connect به سرور ایجاد میشند و در رویداد OnConnect به شما داده میشه را جایی ذخیره کنید، و بعد از طریق آن به کلاینت پیام ارسال کنید. ولی این کار باعث اجرای رویدادی در سمت کلاینت نمیشه، و کلاینت باید خودش یا بدونه کی سرور پیام ارسال میکنه، و بلافاصله بعد از ارسال از Connection داده را بخونه، یا باید مرتبا در فواصل زمانی معین Connection را برای آمدن داده های جدید بررسی کنه.

Little Robot
پنج شنبه 29 اسفند 1387, 15:27 عصر
خيلي ممنون دوست عزيز :لبخندساده:
فقط از اين قسمت يه مثال ساده ميزنيد چون اصلا چيزي در موردش نميدونم!!


می تونید لیستی از Threadهای مربوط به هر کلاینت که در زمان Connect به سرور ایجاد میشند و در رویداد OnConnect به شما داده میشه را جایی ذخیره کنید، و بعد از طریق آن به کلاینت پیام ارسال کنید. ولی این کار باعث اجرای رویدادی در سمت کلاینت نمیشه، و کلاینت باید خودش یا بدونه کی سرور پیام ارسال میکنه، و بلافاصله بعد از ارسال از Connection داده را بخونه، یا باید مرتبا در فواصل زمانی معین Connection را برای آمدن داده های جدید بررسی کنه.:متفکر:

vcldeveloper
جمعه 30 اسفند 1387, 09:23 صبح
فقط از اين قسمت يه مثال ساده ميزنيد چون اصلا چيزي در موردش نميدونم!!



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPServer, StdCtrls, Contnrs;

type
TForm1 = class(TForm)
IdTCPServer1: TIdTCPServer;
btnSendText: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure IdTCPServer1Connect(AThread: TIdPeerThread);
procedure IdTCPServer1Disconnect(AThread: TIdPeerThread);
procedure btnSendTextClick(Sender: TObject);
private
FSyncObj : TMultiReadExclusiveWriteSynchronizer;
FClients : TObjectList;
public
property Clients: TObjectList read FClients;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
FSyncObj := TMultiReadExclusiveWriteSynchronizer.Create;
FClients := TObjectList.Create(False);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(FClients);
FreeAndNil(FSyncObj);
end;

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
FSyncObj.BeginWrite;
try
FClients.Add(AThread);
finally
FSyncObj.EndWrite;
end;
end;

procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
begin
FSyncObj.BeginWrite;
try
FClients.Remove(AThread);
finally
FSyncObj.EndWrite;
end;
end;

procedure TForm1.btnSendTextClick(Sender: TObject);
var
Client : TIdPeerThread;
i : integer;
begin
FSyncObj.BeginRead;
try
for i := 0 to FClients.Count-1 do
begin
Client := FClients[i] as TIdPeerThread;
Client.Connection.WriteLn('This is a server message');
end;
finally
FSyncObj.EndRead;
end;
end;

end.