ورود

View Full Version : حرفه ای: مشکل با WriteLn() در IdTcpServer



Delphi 2010
چهارشنبه 31 فروردین 1390, 08:48 صبح
سلام خدمت دوستان عزیز
من سایت رو گشتم و چیزی پیدا نکردم که ارسال پیغام رو در سمت سرور توضیح داده باشه

همه فقط ارسال پیغام از سمت کلاینت رو به سرور توضیح داده بودند که کد زیر هستش

IdTCPClient1.IOHandler.WriteLn(sEdit3.Text);

حالا اگر من بخوام از سمت IdTcpServer به IdTcpClient یه پیغام بفرستم با چه دستوری این کار رو انجام بدم
میدونم که باید هر دو برنامه نقش سرور و کلاینت داشته باشند یعنی PeerToPeer باشن ولی بنا به دلایلی باید اینطوری انجام بدم کار رو یعنی یک نفر سرور و بقیه کلاینت

حالا از شما درخواست میکنم این قطعه کد رو بگید من هرچی کد نوشتم کار نکرد

در ضمن با دلفی 2010 و Indy10 دارم کار میکنم

vcldeveloper
چهارشنبه 31 فروردین 1390, 13:38 عصر
حالا اگر من بخوام از سمت IdTcpServer به IdTcpClient یه پیغام بفرستم با چه دستوری این کار رو انجام بدم
بر فرض اینکه خودتون بتونید به درستی در سمت کلاینت پیام های رسیده رو هندل کنید، بعد از ایجاد ارتباط بین سرور و کلاینت، می تونید با کد زیر پیامی به کلاینت متصل شده، ارسال کنید:

AContext.Connection.IOHandler.WriteLn();

البته اگر منظور این هست که بدون اتصال کلاینت به سرور، سرور شما خودش به کلاینت متصل بشه و پیام بفرسته، نمیشه؛ چون سرور و کلاینت یک مفهوم هستند. سیستمی که خودش یک اتصال رو شروع میکنه، نقش کلاینت رو داره، حالا شما اسمش رو هر چی بذارید، در نقشش تغییری حاصل نمیشه.

Felony
چهارشنبه 31 فروردین 1390, 14:09 عصر
در رویداد OnExecute شئ idTCpServer میتونید این کار رو بکنید :

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
begin
AContext.Connection.IOHandler.WriteLn('Test');
end;

با روش هایی هم میتونید از خارج از این رویداد پیغام رو ارسال کنید ؛ مثلا رویداد رو در زمان مورد نیاز صدا بزنید ولی با یان کار به کلاینت جاری که به سرور متصل هست و داخل AContext قرار داره پیغام ارسال میشه ، اگر میخوای به کلاینت خاصی پیغام ارسال کنی باید از متد Binding شئ idTCpServer استفاده کنی ، مثلا با کد زیر به اولین کلاینت متصل شده پیغام Test ارسال میشه :

IdTCPServer1.Bindings.Items[0].Send('Test');

Delphi 2010
پنج شنبه 01 اردیبهشت 1390, 08:31 صبح
ممنون آقای کشاورز
ممنون مجتبی جان

ولی بازم مشکل با بر جا هستش
طبق کد آقای کشاورز نمیشه عمل کرد چون وقتی کدشون رو توی باتن میزارم و اجرا میخوام بکنم اصلا AContext رو نمیشناسه و خطا میگیره

طبق کد اول مجتبی جان من نمیتونم توی OnExecute بنویسم چون میخوام در مواقع خاص برای کلاینت پیامی ارسال کنم که مجبورم توی یک شی دیگه مثل باتن این عمل رو انجام بدم

طبق کد دوم مجتبی جان هم به نوشته داخل پرانتز گیر میده دلفی چون نوشته از نوع Text هستش ولی داده ورودی Send از نوع TByte هستش

من میخوام که کدی باشه که به تمامی کلاینت هایی که بهم وصل هستن بدون استثناء پیغام ارسال کنم البته با زدن یک باتن

ممنون دوستان عزیز از راهنمائیاتون کمک کنید خواهشا

Felony
پنج شنبه 01 اردیبهشت 1390, 09:19 صبح
از چه نسخه ای از دلفی استفاده میکنید ؟ متد Send یک متد Overload شده هست بسته به نسخه دلفیتون و نسخه Indy که نصب هست ممکنه نیاز به پارامترهای دیگه ای داشته باشه ، شکل کلی دستور برای ارسال به همه کلاینت ها به صورت زیر میشه حالا خودتون باید بر حسب نسخه دلفیتون تغییرش بدید :

var
i: Integer;
begin
for i:= 0 to IdTCPServer1.Bindings.Count-1 do
IdTCPServer1.Bindings.Items[i].Send('Test');
end;

Delphi 2010
پنج شنبه 01 اردیبهشت 1390, 09:52 صبح
مجتبی جان از دلفی 2010 و Indy اون استفاده میکنم

کد شما گذاشتم ولی این خطا رو میده
[DCC Error] Unit1.pas(49): E2010 Incompatible types: 'TBytes' and 'string'

حالا به نظر شما مشکل چی هست

ممنون

Delphi 2010
جمعه 02 اردیبهشت 1390, 07:49 صبح
کسی نیست جواب بده عزیزان


فقط با زدن یه باتن برای تمامی کلاینت های متصل به سرور پیغام ارسال بشه

Felony
جمعه 02 اردیبهشت 1390, 08:49 صبح
چه جوابی ؟ بهتون که روش کار رو گفتم ، خودتون بررسی کنید ببینید متد Send در دلفی 2010 یک متد Ovrload شده هست یا نه ( من یادم نیست ولی فکر کنم باشه و تعداد پارامترها فرق کنه ) اگر نه حتما متدی برای ارسال متن داره یا اینکه میتونید نسخه جدید Indy رو نصب کنید .

Delphi 2010
جمعه 02 اردیبهشت 1390, 18:57 عصر
مشکل همچنان هست

Delphi 2010
جمعه 02 اردیبهشت 1390, 21:11 عصر
آقا مجتبی با این کد به نظرتون درسته کار میکنه


var i: Integer;
begin
for i:= 0 to IdTCPServer1.Bindings.Count-1 do
IdTCPServer1.Bindings.Items[i].Send(BytesOf('Salam Golam'),0,0);

در ضمن توی کلاینت هم نمیدونم چطوری دریافت پیغام از سرور رو کنتزل کنم که سرعت نرم افزار کم نشه