PDA

View Full Version : همه چیز درباره Indy



Gladiator
شنبه 20 تیر 1383, 23:43 عصر
با سلام ؛

در مرحله اول آور ویویی بر کار سرورها و کلاینتها خواهیم داشت .

کلاینت :

کلاینت به این شکل به سرور متصل میشه :


with IndyClient do begin
Host := 'IndyServer.Barnamenevis.org';
آدرس سروری که میبایست به آن متصل شد .

Port := 6000;
شماره پورتی که کلاینت باید به آن متصل شود .

Connect; Try
اقدام جهت برقراری ارتباط .

finally Disconnect; end;
و در نهایت قطع ارتباط

end;

Gladiator
شنبه 20 تیر 1383, 23:52 عصر
توضیحات درباره کلاینت ؛

کاری که کلاینت انجام میده اینه که جهت برقراری ارتباط آدرسی رو بعنوان Host Name ( که میتونه هم آدرس آی پی باشه و هم نام دی ان اسی ) و شماره ای رو بعنوان Port دریافت میکنه و بر اساس این 2 مشخصه توی شبکه بدنبال سرور میگرده و پس از پیدا کردن سرور اگر اجازه ورود داشته باشه به سرور متصل میشه .

Gladiator
یک شنبه 21 تیر 1383, 00:02 صبح
سرور :

سرور ایندی بعد از فعال شدن در شبکه منتظر درخواستها میماند ٬ سرور به همه تقاضا ها گوش میکند و هر کدام را که مجاز به ورود باشد قبول میکند . سرور پس از قبول تقاضای کلاینت ٬ درون خود سرنخی ( Thread ) ایجاد میکند و امور مربوط به این اتصال را به آن قسمت هدایت میکند .

در تصویر پیوست نمایی از فعالیت سرور را میبینید .

vcldeveloper
یک شنبه 21 تیر 1383, 00:54 صبح
:flower: :تشویق:
امیدوارم ادامه داشته باشه!

انشاء الله!

Gladiator
یک شنبه 21 تیر 1383, 08:57 صبح
مدلهای برنامه نویسی برای سوکتها :

در برنامه نویسی سوکتها برای ویندوز دو مدل برنامه نویسی داریم ٬ یکی Blocking و دیگری Non-Blocking . گاهی اوقات این دو مدل سنکرون و آسنکرون هم خوانده میشوند .

synchronous به معنای همزمان
asynchronous به معنای غیر همزمان

تعداد اندکی مدلهای برنامه نویسی دیگری نیز موجود است که به دلیل نیاز به کد نویسی و داشتن اطلاعات بیشتر برای برنامه نویسی ابزارهای پیشرفته رزرو شده اند .

said ali
یک شنبه 21 تیر 1383, 10:18 صبح
با سلام
با تشکر ادامه بدید :flower: :flower: :flower: :wink:

Gladiator
یک شنبه 21 تیر 1383, 12:23 عصر
Blocking :

ایندی از روش Blocking Socket Calls استفاده میکند ٬ عملکرد این روش دقیقا مشابه خواندن و نوشتن در فایلهاست . وقتی که شما اطلاعات را میخوانید و یا اینکه اطلاعات را مینویسید توابع تا پایان کار بازگردانده نمیشوند .

تفاوت کار فایلها و سوکتها در اینه که اطلاعات ممکنه در مورد سوکتها زمان بیشتری رو جهت بهره بری نیاز داشته باشه در صورتی که در فایلها این عمل خیلی سریع انجام میشه ٬ در کار با سوکتها ممکنه اطلاعات بی درنگ و بی وقفه آماده خواندن و نوشتن نباشه ٬ سرعت خواندن و نوشتن اطلاعات به نوع ارتباط شبکه ( سرعت انتقال اطلاعات ) بستگی داره .

ایندی ٬ برای برقراری ارتباط یک درخواست ارسال میشود و منتظر جواب میماند . اگر ارتباط برقرار شد پیامی بر مبنای برقراری ارتباط ارسال میگردد ( پس از برقراری ارتباط ) و در صورتی که ارتباط برقرار نشد پیام مناسبی را ارسال میکند .

Gladiator
دوشنبه 22 تیر 1383, 23:51 عصر
Non Blocking :

این روش بر مبنای رویدادها کار میکنه ٬ در این روش شما نیاز دارید که برای رویدادهای مختلف کد نویسی کنید . مثلا ٬ موقعی که شما اقدام به برقراری ارتباط میکنید ٬ شما باید متد اتصال را فراخوانی کنید ٬ متد اتصال بی درنگ قبل از اتصال سوکت برگردانده میشود . وقتی سوکت متصل شد رویداد جدیدی رخ میدهد .

منطق این روش نیازمند اجرای پروسه های زیادی است .

hr110
سه شنبه 23 تیر 1383, 07:03 صبح
:تشویق: :flower: :kiss:
اگه ممکنه در مورد threadهای سمت سرور هم کمی توضیح بدهید، توضیح در مورد اینکه چگونه این کار انجام میشود و چطور میتوان آن را پیاده نموده

_alish_
سه شنبه 23 تیر 1383, 14:44 عصر
خیلی جالب شد
لطفا یک مثال کوچک همراه با توضیح بیاورید :flower: :تشویق:

Gladiator
چهارشنبه 24 تیر 1383, 08:34 صبح
:تشویق: :flower: :kiss:
اگه ممکنه در مورد threadهای سمت سرور هم کمی توضیح بدهید، توضیح در مورد اینکه چگونه این کار انجام میشود و چطور میتوان آن را پیاده نموده

با سلام ؛

چشم آقای ربیعی به اون قسمت هم خواهیم رسید ٬ در مورد مثال هم در انتهای کار یک برنامه چت ساده مینویسم و سورسش رو در اختیارتون قرار میدم .

_alish_
چهارشنبه 24 تیر 1383, 09:02 صبح
بابا دمت گرم تو دیگه کی هستی بابا تو دیگه کی هستی ....
موفق باشی دوست عزیز :flower: :تشویق:

Gladiator
چهارشنبه 24 تیر 1383, 09:47 صبح
مشکل Freeze در کلاینتها :

در روش برنامه نویسی Blocking تماسها پس از کامل شدن کارشان پاسخ بازگشتی نمیدهند . وقتی چنین تماسهایی در Thread اصلی برنامه ساخته میشوند ٬ برنامه نمیتواند به درخواست کاربر پاسخ دهد و به این ترتیب سبب میشود برنامه به حالت Freeze در آید .

Freeze به این علت صورت میگیرد که پیامهای جدید و پیامهای جدید شده ( بروز شده ) تا زمانی که پاسخ تماسهای سوکتهای بلاکینگ ( بعد از انجام کار ) به کنترل رسیدگی کننده برنامه نرسد نمیتوانند پیشرفتی داشته باشند .

Gladiator
چهارشنبه 24 تیر 1383, 12:21 عصر
حل مشکل Freeze شدن کلاینتها :

در مجموعه کامپوننتهای ایندی کامپوننت ویژه ای موجود است به نام TIdAntiFreeze که مشکل Freeze برنامه های شما رو خیلی راحت حل میکنه .

وجود تنها یک کامپوننت TIdAntiFreeze به شما این امکان را میدهد تا تماسهای نوع بلاکینگ را بدون مشکل Freeze شدن در Thread اصلی برنامه داشته باشید .

استفاده از یک کامپوننت TIdAntiFreeze برای برنامه های مبنی بر بلاکینگ سوکت مفید است و به شدت توصیه میگردد .

Gladiator
چهارشنبه 24 تیر 1383, 12:56 عصر
Non Blocking مشکل Freeze را ندارد :

در مدل برنامه نویسی Non Blocking ویندوز کنترل کاملی بر رویدادها دارد از این رو ویندوز حتی میتواند همزمان به پیامهای دیگری هم پاسخ دهد .

در مدل برنامه نویسی Non Blocking یک Thread میتواند با سوکتهای زیادی سروکار داشته باشد . وقتی که نیازی به Thread ها جهت کار با تعداد سوکتهای زیاد نداشته باشیم میزان استفاده از منابع حافظه و پردازنده نیز کاهش میابد .

jirjirakk
پنج شنبه 25 تیر 1383, 13:17 عصر
گلادیاتور جان ناز نفست :: کار واقعا باحالی رو شروع کردی :)
میشه یه توضیح هم بدی از هر کدوم از این دو روش چه موقعی باید استفاده کنیم، یا اینکه کدوم روش بهتر هستش :flower:

:heart:

Gladiator
پنج شنبه 25 تیر 1383, 13:39 عصر
مثال عملی :

بزرگترین تفاوت بین فایلها و سوکتها این است که در مجموع سرعت دسترسی به فایلها بیشتر است ٬ هرچند دسترسی به فایلها همیشه هم سریع نیست . فلاپی دیسک ها ٬ درایوهای شبکه ای ٬ منابع پشتیبان گیری و منابع سلسله مراتبی غالبا برای کار با فایلها زمان زیادی را نیاز دارند .

در ادامه برای بهتر عنوان کردن مطالب مثالی را در مورد نحوه کار کردن مدل برنامه نویسی Blocking و Non Blocking بروی فایلها عنوان می کنم .

و اما مثال :

در ذیل روش باز کردن ٬ نوشتن اطلاعات و سرانجام بستن فایلی را از طریق دو مدل برنامه نویسی Blocking و Non Blocking را توضیح میدهیم .

ابتدا یک متغیر رشته ای تعریف میکنیم و مقداری را به آن میدهیم .


procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
begin
s := 'Welcome To Barnamenevis.org , Stay and Enjoy' + #13#10;

حالا اقدام به ایجاد و باز کردن فایل میکنیم .


try
with TFileStream.Create('c:\Barnamenevis\test.dat', fmCreate) do try

در این مرحله نوبت نوشتن اطلاعات در فایل است .


WriteBuffer(s[1], Length(s));

و در آخر فایل را میبندیم .


finally Free; end;
end;
end;

این مثالی کوچک بر مدل برنامه نویسی Blocking بود ٬ همانطور که ملاحظه میفرمایید در مدل برنامه نویسی بلاکینگ کل کد نویسی در یک محل و پشت سر هم قرار دارد . ( در این مثال در رویداد OnClick مربوط به ‌Button1 صورت گرفت ) .

Gladiator
پنج شنبه 25 تیر 1383, 17:40 عصر
حالا برای انجام همان کار در مدل برنامه نویسی Non Blocking به این شکل عمل میکنیم :

در این مثال بصورت خیالی File1 را کامپوننت فایل Non Blocking در نظر گرفته ایم .

در ابتدا فرض را بر این میگذاریم که کامپوننت File1 را بروی فرم قرار داده ایم ٬ برای شروع فایلی را که در مثال قبلی ایجاد کرده بودیم را باز میکنیم .


procedure TForm1.Button1Click(Sender: TObject);
begin
File1.Filename := 'c:\Barnamenevis\test.dat';
File1.Open;
end;

در دومین قدم موقعی که فایل باز شد اقدام به نوشتن در فایل میکنیم .


procedure TForm1.File1OnOpen(Sender: TObject);
var
i: integer;
begin
FWriteData := 'Hello Mehdi Keramati , I am not a bad guy' + #13#10;
i := File1.Write(FWriteData);
Delete(FWriteData, 1, i);
end;

در سومین قدم موقعی که اطلاعات در فایل نوشته شد فایل را میبندیم .


procedure TForm1.File1OnWrite(Sender: TObject);
var
i: integer;
begin
i := File1.Write(FWriteData);
Delete(FWriteData, 1, i);
if Length(FWriteData) = 0 then begin
File1.Close;
end;
end;

و در انتها بعد از بسته شدن فایل همه چیز به حالت عادی باز میگردد .


procedure TForm1.File1OnClose(Sender: TObject);
begin
Button1.Enabled := True;
end;

ما در حقیقت هیچ گونه شی نوشتن فایل Non Blocking نداریم اما اگر همچین چیزی وجود داشت کد ما شبیه به کدی میشد که در مثال فوق به آن اشاره شد .

Gladiator
پنج شنبه 25 تیر 1383, 18:23 عصر
لازم میدونم یک سری توضیحات کوتاهی رو در مورد مثال دوم بنویسم .

اول اینکه شما باید به نحوه کار و کد نویسی دقت کنید و این مدل برنامه نویسی رو درک کنید ٬ هر لحظه که تصمیم گرفتید برنامه نویسی مدل Non Blocking را شروع کنید آنگاه متوجه خواهید شد که این مثال ساده و کوتاه چقدر میتواند مفید باشد .

مرحله اول :
رویداد Button1Click فایل را صدا زد و آن را باز نمود . تا موقع بازگرداندن متد Open فایل باز نشده و هنوز غیر قابل دسترسی است .

مرحله دوم :
رویداد OnOpen موقعی اعمال میشود که فایل باز شده و آماده دسترسی است . سعی در نوشتن در فایل میشود ولی همه اطلاعات ممکن است قابل قبول نباشد در این هنگام متد Write مقدار بایت قابل قبول برای نوشتن را بازمیگرداند ٬ اطلاعات ذخیره میشند ولی دوباره بعدا چک میشوند .

مرحله سوم :
رویداد OnWrite موقعی اعمال میشود که فایل آماده نوشتن اطلاعات بیشتر است و متد Write دوباره برای دریافت باقیمانده اطلاعات کوشش میکند .

مرحله سوم تا زمانی که همه اطلاعات مورد قبول متد Write قرار گیرد دائما تکرار میشود ٬ موقعی که همه اطلاعات مورد قبول متد Write واقع شد متد Close فراخوانی میشود ولی فایل هنوز بسته نشده است .

وقتی رویداد OnClose اعمال میشود فایل دگر بسته شده است .

Gladiator
جمعه 26 تیر 1383, 11:13 صبح
در ادامه جهت معرفی دو کامپوننت IdTcpServer و IdTcpClient از مجموعه کامپوننتهای Indy نمونه برنامه ای را ارائه خواهم کرد و سپس مرحله به مرحله بروی برنامه به معرفی کامپوننتها خواهیم پرداخت .

vcldeveloper
شنبه 27 تیر 1383, 01:53 صبح
آقای گلادیاتور...مرسی :flower:

Gladiator
چهارشنبه 31 تیر 1383, 13:24 عصر
با سلام مجدد ؛

برای ادامه یکی از مقالات سایت Delphi.About.com رو ترجمه میکنم و پیرو اون بحث رو ادامه میدیم البته از این به بعد عملی .

Gladiator
چهارشنبه 31 تیر 1383, 13:30 عصر
در این مرحله میخوایم برنامه ای رو بصورت سرور / کلاینت بنویسیم که از طریق این برنامه بتونیم از روی کامپیوترهایی که برنامه کلاینت بروی اونها در حال اجراست Screen Shot هایی رو تهیه کنیم و به سرور ارسال کنیم .

حالا اول من برنامه رو آماده میکنم بعد اینجا قرارش میدم تا شما سورسش رو دانلود کنید .

Mahdi_S_T
چهارشنبه 31 تیر 1383, 20:24 عصر
قبلا من در مورد برنامه کافی نت از جناب gladiator راهنمایی خواستم . ظاهرا این تاپیک جواب خوبی برای من است . از زحمات جنابعالی کمال تشکر را دارم :flower: :heart:

jirjirakk
چهارشنبه 31 تیر 1383, 20:43 عصر
گلادیاتور جان منم این کارو قبلا انجام دادم و سورسش و اینجا قرار میدم

Mahdi_S_T
پنج شنبه 08 مرداد 1383, 16:55 عصر
چی شد ؟ دیگه خبری نیست !!؟

Gladiator
پنج شنبه 27 اسفند 1383, 21:48 عصر
چی شد ؟ دیگه خبری نیست !!؟

توی تعطیلات نوروز ادامه میدم این بحث رو ...

:flower:

Gladiator
پنج شنبه 27 اسفند 1383, 21:58 عصر
یک نمونه برنامه برای ارسال Email برای یکی از دوستان درست کردم ٬ همین باعث شد که تصمیم بگیرم این بحث رو ادامه بدم . همون برنامه رو اینجا قرار میدم تا بقیه دوستان هم استفاده کنند .

توضیحاتش رو الان مینویسم .

Gladiator
پنج شنبه 27 اسفند 1383, 22:06 عصر
if SMTP.Connected=false then begin
SMTP.Host:='mail.barnamenevis.org';
SMTP.Port:=25;
SMTP.Username:='MySMTPMailAccount';
SMTP.Password:='MySMTPMailPassword';
SMTP.Connect;
MyMessage.Body.Text:=Memo1.Text;
MyMessage.From.Address:='Gladiator@Barnamenevis.or g';
MyMessage.Recipients.EMailAddresses:=edit1.Text;
MyMessage.Subject:=edit2.Text;
TIdAttachment.Create(MyMessage.MessageParts,OpenDi alog1.FileName);
SMTP.Send(MyMessage);
end
else
begin
MyMessage.Body.Text:=Memo1.Text;
MyMessage.From.Address:='Gladiator@barnamenevis.or g';
MyMessage.Recipients.EMailAddresses:=edit1.Text;
MyMessage.Subject:=edit2.Text;
TIdAttachment.Create(MyMessage.MessageParts,OpenDi alog1.FileName);
SMTP.Send(MyMessage);
end;

ابتدا باید کامپوننت IdSMTP رو setup کنیم ٬ برای اینکار به شکل ذیل عمل میکنیم :


IdSMTP.Host:='YourHostname or IPAddress';

IdSMTP.Port:=25;

دوستان توجه کنید پراپرتی Host همون آدرس سروریه که شما ازش اکانت SMTP دارید . میتونید نام دی ان اسی و یا آدرس ای پی اون رو برای این پراپرتی ست کنید .
پراپرتی دیگه ای که در این قسمت داریم Port که باید حتما مقدار صحیح رو ست کنید ٬ معمولا عدد 25 شماره پورت SMTP تعریف میشه .

ادامه دارد .

Gladiator
جمعه 28 اسفند 1383, 11:25 صبح
IdSMTP.Username:='MyUsername';
در این قسمت خودتون رو به سرور معرفی میکنید .


IdSMTP.Password:='MyPassword';
و این هم رمز عبور شما برای متصل شدن به سرور .


IdSMTP.Connect;
حالا سعی میکنیم که به سرور متصل بشیم ٬ در این قسمت میتونیم TimeOut رو هم مشخص کنیم .

تا اینجا ملزومات برقراری اتصال به SMTP Server رو فراهم کردیم ٬ حالا میتونیم بدنه Email رو Setup کنیم .

Gladiator
جمعه 28 اسفند 1383, 11:47 صبح
MyMessage.Body.Text:=Memo1.Text;
MyMessage.From.Address:='Gladiator@barnamenevis.or g';
MyMessage.Recipients.EMailAddresses:=edit1.Text;
MyMessage.Subject:=edit2.Text;
TIdAttachment.Create(MyMessage.MessageParts,OpenDi alog1.FileName);
SMTP.Send(MyMessage);

برای ارسال نامه الکترونیک از طریق ایندی شما به یک کامپوننت TidMessage نیاز دارید ٬ به واسطه این کامپوننت شما میتونید بدنه نامه رو بسازید و بعد از طریق TidSMTP ارسال کنید .

در کد فوق من کامپوننت TidMessage رو به MyMessage تغییر نام دادم و همچنین TidSMTP رو به SMTP .


MyMessage.Body.Text:=Memo1.Text;
ابتدا متن نامه رو از طریق یک Memo میگیریم .


MyMessage.From.Address:='Gladiator@barnamenevis.or g';
براش مشخص میکنیم که نامه از طرف چه کسی ارسال شده .


MyMessage.Recipients.EMailAddresses:=edit1.Text;
مشخص میکنیم که نامه به چه آدرس یا آدرسهایی باید ارسال بشه .


MyMessage.Subject:=edit2.Text;
عنوان نامه رو مشخص میکنیم .

تا اینجا بدنه نامه الکترونیک رو هم Setup کردیم . اگر نیاز دارید که همراه این نامه یک فایل ضمیمه نیز ارسال کنید ٬ کافیه مسیر فایل مورد نظر رو مشخص کنید و به شکل ذیل عمل کنید :


TIdAttachment.Create(TidMessage.MessageParts,OpenD ialog1.FileName);

TidAttachment به شما این امکان رو میده که به همراه پیام یک فایل رو هم ارسال کنید .

حالا نوبت به ارسال Email میرسه :


TidSMTP.Send(IdMessage);

Gladiator
جمعه 28 اسفند 1383, 13:19 عصر
توجه داشته باشید که ارسال نامه های الکترونیک به این روش بسیار ساده و کاراست .

حالا بر میگردیم به اصل مطلب ٬ مهمترین کامپوننتهایی که در مجموعه کامپوننتهای ایندی مشاهده میشه ( البته هر کامپوننتی برای کاری ساخته شده ) TidTCPClient و TidTCPServer هستند .

با هم نمونه برنامه ای که برای این منظور نوشتم رو بررسی میکنیم و این بحث رو به پایان میرسونیم .

Delphi Skyline
سه شنبه 02 فروردین 1384, 11:59 صبح
آقای gladiator من یدونه کامپیوتر دارم (Windows XP Media Editon 2005) و نمی خوام serverم تحت اینترنت باشه . آیا می شه من تو کامپیوترم یک Server درست کنم برای خودم . و حتی یک client . یعنی من هم بشم کاربر و هم Admin و بعد هم می خوام دیتابیسی باشه (With ACCESS) . بای (البته اینا برای یادگیری بود)

Gladiator
سه شنبه 02 فروردین 1384, 12:31 عصر
من دقیقا متوجه نشدم که چی میخوای !

در مورد سرور و کلاینت بروی یک کامپیوتر ٬ بله هیچ مشکلی نیست ٬ کافیه Host رو برابر با 127.0.0.1 قرار بدی .

در مورد Database هم متوجه نشدم منظورت چیه .

Delphi Skyline
سه شنبه 02 فروردین 1384, 14:26 عصر
خوب بعد نام server یا همان server name رو چی بزنم .
و بعد چه طوری یک user براش تعریف کنم ؟

Delphi Skyline
سه شنبه 02 فروردین 1384, 14:40 عصر
راسی آقای gladiator در مورد idsmtp . من هر وقت می خوام باهش کاننکت بشم error می زنه . ایمیلم هم با yahoo می زنم .

Gladiator
سه شنبه 02 فروردین 1384, 15:58 عصر
یکبار از اول همه مطالب رو بخون متوجه میشی .

vcldeveloper
چهارشنبه 03 فروردین 1384, 03:07 صبح
راسی آقای gladiator در مورد idsmtp . من هر وقت می خوام باهش کاننکت بشم error می زنه . ایمیلم هم با yahoo می زنم .
با اجازه از Gladiator عزیز،
عزیز جان، اسم کامپوننت هست idSMTP برای ای میلهای رایگان Yahoo نمی تونید از پروتکل های SMTP/POP3 استفاده کنید! (فکر کنم قبلا 16صد بار اینو گفتیم :wink: )

برای مابقی سوالات هم فکر کنم بهتر باشه همونطور که Gladiator گفت دوباره از اول یه دور این تاپیک رو بخونی.
ظاهرا دقیقا متوجه مفاهیمی مثل Server, Client و خود Indy نشدی

Delphi Skyline
چهارشنبه 03 فروردین 1384, 11:29 صبح
پس آقای کشاورز یه دو تا سایت بگید که SMTP باشن برای ایمیلش . آقای کشاورز Yahoo پاپ 3 است ؟
اگر هست توی خود INDY همچین کامپاننتی هست؟

houshmand
چهارشنبه 03 فروردین 1384, 22:02 عصر
آقای کشاورز Yahoo پاپ 3 است ؟
سرویس رایگان نه ولی پولی داره


دو تا سایت بگید که SMTP باشن برای ایمیلش .
gmail :wink: رایگان داره

پریسا نامدار
شنبه 06 فروردین 1384, 23:56 عصر
من هم واقعا به این بحث شیرین علاقه مند شدم و از آقای گلادیاتور عزیز تشکر و قدردانی میکنم.
امیدوارم که این بحث رو همچنان و بر سرعت بیشتر ادامه بدن تا هم من و بقیه اعضای سایت بتونیم استفاده های عملی و مثبتی از اون بکنیم.
:flower:

Gladiator
یک شنبه 07 فروردین 1384, 23:05 عصر
برای شروع کار بروی کامپوننتهای IdTcpClient , IdTcpServer ساده ترین نمونه برنامه رو آماده کردم ٬ توضیحات برنامه رو مینویسم .

Gladiator
یک شنبه 07 فروردین 1384, 23:15 عصر
این برنامه ساده از دو قسمت سرور و کلاینت تشکیل شده ٬ در حقیقت دو برنامه داریم که از طریق سوکتها و پروتوکل TCP/IP با هم ارتباط برقرار میکنند .

در سمت سرور ٬ کامپوننت TidTcpServer رو قرار دادیم و اون رو تنظیم کردیم که بروی پورتی ( مثلا 88000 ) سرویس دهی کنه . در این قسمت ( سرور ساید ) برنامه ما آمادست که کلاینت / کلاینتها بهش متصل بشن .

در سمت کلاینت ٬ کامپوننت TidTcpClient رو قرار دادیم و اون رو تنظیم کردیم که پیرو مشخصات وارد شده توسط کاربر به سرور متصل بشه . در این قسمت برنامه سعی میکنه از طریق سوکتها و پروتوکل TCP/IP به پورت مشخص شده سرور متصل بشه .

ادامه دارد .

majid_n
دوشنبه 08 فروردین 1384, 19:32 عصر
مرسی گلادی جان ادامه بده :flower:

Gladiator
دوشنبه 08 فروردین 1384, 20:00 عصر
در سمت سرور ٬ ابتدا IdTcpServer را setup میکنیم :


Memo1.clear;
IdTCPServer1.DefaultPort:=88000;
IdTCPServer1.MaxConnections:=100;
IdTCPServer1.Active:=true;

در این قسمت پورت پیش فرض را برابر با 88000 قرار دادیم و حداکثر تعداد کانکشنها رو برابر با 100 کانکشن تعریف کردیم .

IdTcpServer رو فعال میکنیم تا سرویس دهی رو شروع کنه ٬ ولی ملزومات دیگری نیز وجود داره که میبایست تنظیم و تعریف بشه .

در رویدادهای IdTcpServer سه رویداد مهم وجود داره :

1) OnConnect
2) OnDisconnect
3) OnExecute

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

در اینجا ما میخواهیم مشخص کنیم هر گاه یک کلاینت به سرور ما متصل میشود IP Address اون کلاینت درون یک Memo ثبت بشه .

در رویداد اول اینچنین مینویسیم :


Memo1.Lines.Add(AThread.Connection.Socket.Binding. PeerIP + ' loged in');
Memo1.Update;

در اینجا Athread همان سر نخی است که در این برنامه ساده کلاینت ما به آن متصل میشود . در مورد Athread بعدا صحبت خواهیم کرد .

حال نیاز داریم هر گاه کلاینتی از سرور ما قطع ارتباط کرد این عمل در Memo ثبت شود ٬ برای این منظور به این شکل عمل میکنیم :

در رویداد دوم اینچنین مینویسیم :


Memo1.Lines.Add(AThread.Connection.Socket.Binding. PeerIP + ' Loged out.');
Memo1.Update;


AThread.Connection.Socket.Binding.PeerIP

به این وسیله IP Address کلاینت را بدست می آوریم .

حال نیاز داریم ٬ مشخص کنیم که پیامهای ارسالی توسط کلاینت در Memo ثبت شوند ٬ برای این منظور در رویداد سوم به این شکل عمل میکنیم :


Memo1.Lines.Add(AThread.Connection.Socket.Binding. PeerIP + ' : ' + AThread.Connection.ReadLn);
Memo1.Update;

در اینجا connection.Readln پیامی که کلاینت برای شما ارسال کرده را دریافت میکند .

Delphi Skyline
دوشنبه 08 فروردین 1384, 22:55 عصر
آقای GLADIATOR این برنامه بدون هیچ نیازی به چیزی که رو سیستم نصب بشه کار می کنه ؟
یعنی من می تونم با WINDOWS XP و بدون هیچ چیز ازش استفاده کنم ؟
آخه به من می گه :


Connected Time Out

vcldeveloper
سه شنبه 09 فروردین 1384, 02:32 صبح
این برنامه بدون هیچ نیازی به چیزی که رو سیستم نصب بشه کار می کنه ؟
یعنی من می تونم با WINDOWS XP و بدون هیچ چیز ازش استفاده کنم ؟
بله، نیاز به چیزی نداره.


آخه به من می گه :


Connected Time Out
قبل از connect شدن با کلاینت باید برنامه سرور رو اجرا کرده باشی! اگه سرور در حال کار نباشه که کلاینت نمی تونه بهش کانکت بشه!!

majid_n
سه شنبه 09 فروردین 1384, 20:02 عصر
گلادی جان یک سوال :
چرا وقتی برنامه client را connect می کنیم فایروال پورت 22464 را نشون میده ؟ مگه پورت روی 88000 ست نیست ؟؟؟
:گیج:

Gladiator
سه شنبه 09 فروردین 1384, 21:14 عصر
چرا وقتی برنامه client را connect می کنیم فایروال پورت 22464 را نشون میده ؟ مگه پورت روی 88000 ست نیست ؟؟؟

مطمئنی که پورت رو عوض نکردی ؟ من که همچین چیزی ندیدم .

Delphi Skyline
چهارشنبه 10 فروردین 1384, 00:08 صبح
چه طوری می شه یک برنامه چت ساخت . یعنی دو طرفه باشه . یعنی طرف اول هم بگیره و هم ارسال کنه و طرف دوم هم به همین صورت .. ؟ :گیج: :گیج: :گیج: :گیج: :گیج: :گیج: :گیج:

vcldeveloper
چهارشنبه 10 فروردین 1384, 02:22 صبح
چه طوری می شه یک برنامه چت ساخت . یعنی دو طرفه باشه . یعنی طرف اول هم بگیره و هم ارسال کنه و طرف دوم هم به همین صورت .. ؟
هر دو کامپوننت IdTcpClient , IdTcpServer رو در یک برنامه استفاده کن و اونها رو براساس اطلاعاتی که قبلا در همین تاپیک Gladiator زحمت کشیده و اراپه کرده، تنظیم کن.

Gladiator
چهارشنبه 10 فروردین 1384, 11:03 صبح
با سلام خدمت استاد عزیز آقای کشاورز .

به هیچ وجه نیاز نیست هر دو کامپوننت IdTcpServer , IdTcpClient رو جهت به قول شما 2 طرفه بودن برنامه قرار بدی ٬ ولی این کار هم عملیه البته بسته به برنامه ای که مد نظر داری داره که در اینصورت پیشنهاد میکنم از 2 پورت مختلف استفاده کنی .

شما یک برنامه بعنوان سرور داشته باش و فقط درش از IdTcpServer استفاده کن و برنامه های دیگه که قرار با هم چت کنند ٬ ( مثل یاهو مسنجر و غیره ... ) فقط به IdTcpClient نیاز دارند .

همین برنامه ساده ای که اینجا قرار دادم رو به زودی بعد از اتمام توضیحات اولیه تغییر میدیم و کم کم همچین برنامه ای ( تقریبا مثل یاهو مسنجر ) ایجاد میکنیم .

موفق باشید .

Delphi Skyline
چهارشنبه 10 فروردین 1384, 12:14 عصر
آقای گلادیاتور . آخه من که می خوام چت کنم باید نوشته های اونو ببینم (با Client) اما این کار فقط در صورت استفاده از Server می شه و Server هم نمی شه که دو تا باشه . بای

Gladiator
چهارشنبه 10 فروردین 1384, 17:57 عصر
با IdTcpClient هم میتونی پیام به سرور ارسال کنی و هم از سرور پیام دریافت کنی .

موفق باشی .

Delphi Skyline
پنج شنبه 11 فروردین 1384, 14:18 عصر
متشکرم

vcldeveloper
شنبه 13 فروردین 1384, 01:49 صبح
پس چی شد آقای گلادیاتور .
با اجازه از سرور گرامی آقای Gladiator :

به زودی بعد از اتمام توضیحات اولیه تغییر میدیم و کم کم همچین برنامه ای ( تقریبا مثل یاهو مسنجر ) ایجاد میکنیم

صنم
یک شنبه 14 فروردین 1384, 07:10 صبح
سلام
میشه یه برنامه بانک اطلاعاتی ساده رو مثال بزنید که روی سرور نصب بشه و از طریق کلاینت بشه اون رو اجرا کرد . ممنون :embr:

Gladiator
یک شنبه 14 فروردین 1384, 10:57 صبح
میشه یه برنامه بانک اطلاعاتی ساده رو مثال بزنید که روی سرور نصب بشه و از طریق کلاینت بشه اون رو اجرا کرد .

اگر مطالب رو درست بخونی دیگه این سوال رو مطرح نمیکنی . هرچند این کار رو هم میشه کرد البته دقیقا مثل لقمه ای میمونه که از پشت سرت تابش میدی و آخرشم نمیفهمی مزش چی بوده . عزیز جان برای کار با Database بصورت Server - Client راهکارهای ساده تری وجود داره .

موفق باشی .

Gladiator
یک شنبه 14 فروردین 1384, 11:02 صبح
حالا وقتش رسیده که نشون بدیم چطوری میتونیم بوسیله این کامپوننتها فایلی را بین 2 کامپیوتر منتقل کنیم .

Delphi Skyline
یک شنبه 14 فروردین 1384, 12:57 عصر
آقای گلادیاتور تو این کارا get way نمی خواهد

صنم
دوشنبه 15 فروردین 1384, 07:33 صبح
[quote]اگر مطالب رو درست بخونی دیگه این سوال رو مطرح نمیکنی . هرچند این کار رو هم میشه کرد البته دقیقا مثل لقمه ای میمونه که از پشت سرت تابش میدی و آخرشم نمیفهمی مزش چی بوده . عزیز جان برای کار با Database بصورت Server - Client راهکارهای ساده تری وجود داره .

موفق باشی .
ببخشید من یک مبتدی ام میشه بگین غیر از این چه راه ساده تر دیگه ای هست.

majid_n
سه شنبه 16 فروردین 1384, 22:32 عصر
چرا وقتی برنامه client را connect می کنیم فایروال پورت 22464 را نشون میده ؟ مگه پورت روی 88000 ست نیست ؟؟؟

مطمئنی که پورت رو عوض نکردی ؟ من که همچین چیزی ندیدم .

به این نگاه کن :

Delphi Skyline
چهارشنبه 17 فروردین 1384, 16:16 عصر
با اجازه آقای گلادیاتور . اگر می شه میخواهم در مورد نحوه ساخت مسنجر ساده صحبت کنم .
برای نوشتن یک برنامه چت باید از 2 پورت استفاده کرد (یکی از روش ها)
یعنی مثلا اولی با پورت 30 و دومی با پورت 31 وصل شه.
یعنی . پورت سرور اولی 30 و پورت سرور دومی 31
پرت کلاینت اولی 31 و پورت کلاینت دومی 30 باشد.
خوب حالا سورس برنامه را اینجا می زارم . و خود برنامه را هم همچنین.


form 1
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdTCPServer, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, StdCtrls, IdThreadMgr, IdThreadMgrDefault, xpman,
extCtrls, Menus;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Edit1: TEdit;
client1: TIdTCPClient;
server1: TIdTCPServer;
Button3: TButton;
Button4: TButton;
IdThreadMgrDefault1: TIdThreadMgrDefault;
SkinData1: TSkinData;
GroupBox1: TGroupBox;
Memo2: TMemo;
suiSkinEngine1: TsuiSkinEngine;
Button6: TButton;
Label1: TLabel;
Timer1: TTimer;
Button2: TButton;
Button5: TButton;
SaveDialog1: TSaveDialog;
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure server1Connect(AThread: TIdPeerThread);
procedure server1Disconnect(AThread: TIdPeerThread);
procedure server1Execute(AThread: TIdPeerThread);
procedure Button1Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button3Click(Sender: TObject);
var a:string;
begin
a:='o';
try
client1.Port:=strtoint(form2.Edit3.text);
except
memo2.Lines.Add('شماره پرت شما معتبر نیست');
end;
client1.Host:=form2.Edit5.Text;
try
//client1.Port:=strtoint(form2.Edit2.Text);
except
memo2.Lines.Add('شماره پورت شما معتبر نیست');
end;
try
client1.Connect(100);
except
begin
memo2.Lines.Add('شما به سرور متصل نشدید');
a:='a';
end;
end;
if a='o' then
memo2.Lines.Add('شما به سرور وصل شدید');
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
if client1.Connected then
begin
client1.Disconnect;
memo2.Lines.Add('شما از سرور خارج شدید');
end
else
memo2.Lines.Add('شما به سرور متصل نبودید');
end;

procedure TForm1.server1Connect(AThread: TIdPeerThread);
begin
if form2.CheckBox1.Checked=true then
begin
memo1.Lines.Add(AThread.Connection.Socket.Binding. IP+' : '+'وصل شد');
end
else
memo1.Lines.Add(form2.Edit2.Text+' : '+'وصل شد');
end;

procedure TForm1.server1Disconnect(AThread: TIdPeerThread);
begin
if form2.CheckBox1.Checked=true then
begin
memo1.Lines.Add(AThread.Connection.Socket.Binding. IP+' : '+'ارتباط را قطع کرد');
end
else
memo1.Lines.Add(form2.Edit2.Text+' : '+'ارتباط را قطع کرد');
end;

procedure TForm1.server1Execute(AThread: TIdPeerThread);
begin
if form2.CheckBox1.Checked=true then
begin
memo1.Lines.Add(AThread.Connection.Socket.Binding. PeerIP+' : '+AThread.Connection.ReadLn);
end
else
memo1.Lines.Add(form2.Edit2.Text+' : '+AThread.Connection.ReadLn);
end;

procedure TForm1.Button1Click(Sender: TObject);
var a:string;
begin
if client1.Connected=true then
begin
a:='o';
try
client1.WriteLn(edit1.Text);
except
begin
memo2.Lines.Add('پیام شما ارسال نشد');
a:='a';
end;
end;
if a='o' then
begin
memo2.Lines.Add('پیام شما ارسال شد');
memo1.Lines.Add(form2.Edit1.Text+' : '+edit1.Text);
end;
edit1.Clear;
end
else
memo2.Lines.Add('شما به سرور وصل نیستید');

end;

procedure TForm1.Button6Click(Sender: TObject);
begin
//memo1.Lines.Add(client1.ReadLn);
form2.ShowModal;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if client1.Connected=true then
begin
label1.Caption:='شما وصل هستید';
end
else
label1.Caption:='شما وصل نیستید';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
server1.Active:=false;
application.Terminate;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
savedialog1.Execute;
memo1.Lines.SaveToFile(savedialog1.FileName+'.txt' );
showmessage(' ذخیره شد ');
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
server1.Active:=false;
application.Terminate;
end;

end.





form 2
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm2 = class(TForm)
Label1: TLabel;
Label2: TLabel;
CheckBox1: TCheckBox;
Label3: TLabel;
Label4: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Button1: TButton;
Button2: TButton;
Label5: TLabel;
Edit5: TEdit;
Button3: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.Button2Click(Sender: TObject);
begin
edit1.Clear;
edit2.Clear;
edit3.Clear;
edit4.Clear;
close;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
form1.server1.DefaultPort:=strtoint(edit4.Text);
form1.server1.MaxConnections:=100;
form1.server1.Active:=true;
close;
end;

procedure TForm2.Button3Click(Sender: TObject);
var i:string;
begin
i:=edit4.Text;
edit4.Text:=edit3.Text;
edit3.Text:=i;
end;

end.


خود برنامه را نیز گذاشتم
:oops:

nassim_20
یک شنبه 28 فروردین 1384, 17:21 عصر
دوستان یه سوال داشتم:
با کامپوننتهای Indy میشه یه برنامه مثل HyperTerminal نوشت
اگه ممکنه یه کمی در این رابطه توضیح دهید
ممنون از لطف همه دوستان عزیر.

Gladiator
یک شنبه 28 فروردین 1384, 21:42 عصر
دوستان یه سوال داشتم:
با کامپوننتهای Indy میشه یه برنامه مثل HyperTerminal نوشت
اگه ممکنه یه کمی در این رابطه توضیح دهید
ممنون از لطف همه دوستان عزیر.

بسته به استفاده ای که میخوای بکنی از Hyper Terminal بله و خیر .

دنیای دلفی
یک شنبه 28 فروردین 1384, 22:34 عصر
جناب آقای گلادیاتور سلام و خسته نباشید

من از برنامه ارسال Email شما استفاده کردم و تنظیمات آن را به صورت زیر قرار دادم ولی خطای پایین را می دهد به نظر شما مشکل از چیست :

SMTP.Host:='smtp.gmail.com';
SMTP.Port:=587;
SMTP.Username:='grshn1';
SMTP.Password:='154559665';
SMTP.Connect;
MyMessage.Body.Text:=Memo1.Text;
MyMessage.From.Address:='grshn1@gmail.com';

دنیای دلفی
یک شنبه 28 فروردین 1384, 22:36 عصر
ضمنا این حالت را هم بررسی کردم ولی جواب نداد :

SMTP.Host:='smtp.gmail.com';
SMTP.Port:=465;
SMTP.Username:='grshn1@gmail.com';
SMTP.Password:='154559665';
SMTP.Connect;
MyMessage.Body.Text:=Memo1.Text;
MyMessage.From.Address:='grshn1@gmail.com';

Gladiator
دوشنبه 29 فروردین 1384, 11:18 صبح
به Authentication نیاز داری برای اتصال به SMTP سرور Gmail .

دنیای دلفی
دوشنبه 29 فروردین 1384, 14:10 عصر
به Authentication نیاز داری برای اتصال به SMTP سرور Gmail .

این گزینه به صورت پیش فرض برروی None تنظیم است یک تنظیم دیگر دارد که Login است یعنی باید آن را روی Login قرار دهم .

اگر لطف کنید در این مورد توضیح دهید .
:flower:

nassim_20
دوشنبه 29 فروردین 1384, 22:00 عصر
بسته به استفاده ای که میخوای بکنی از Hyper Terminal بله و خیر .

می خواهم یه فایل یا حداقل یک متن بسیار ساده و کوتاه را بدون استفاده از اینترنت و فقط با مودم و خط تلفن ارسال کنم دقیقا چیزی شبیه به Hyper Terminal
اگه ممکنه در این مورد راهنمایی بفرمایید و یا حداقل بفرمایید از چه کامپوننتهایی باید استفاده کنم (Delphi 6)

vcldeveloper
سه شنبه 30 فروردین 1384, 02:31 صبح
می خواهم یه فایل یا حداقل یک متن بسیار ساده و کوتاه را بدون استفاده از اینترنت و فقط با مودم و خط تلفن ارسال کنم دقیقا چیزی شبیه به Hyper Terminal
اگه ممکنه در این مورد راهنمایی بفرمایید و یا حداقل بفرمایید از چه کامپوننتهایی باید استفاده کنم (Delphi 6)
تاپیک های زیادی در مورد کامپوننت KDTele ایجاد شده، می تونید در سایت بدنبال کلمه KDTele بگردید.

tami_1369
دوشنبه 20 تیر 1384, 05:51 صبح
خیلی کارت درسته گلادیاتور...

MSK
دوشنبه 20 تیر 1384, 17:41 عصر
از همه دوستانی که در این راه زحمت می کشند کمال قدر دانی را دارم.
چه قدر خوب میشه که این کار تداوم پیدا کنه.
در ضمن اگر مسئولین سایت لطف کنند و این تاپیک را در صفحه اول نگه دارند بیشتر مورد استفاده دوستان قرار می گیرد.

متشکر

tami_1369
چهارشنبه 22 تیر 1384, 14:38 عصر
آقا ادامه بده دیگه !!! اه ...

tami_1369
دوشنبه 27 تیر 1384, 05:36 صبح
چی شد؟؟؟نکنه تموم شد دیگه!!!!
من از چیزی سر در نیاوردم.

vcldeveloper
دوشنبه 27 تیر 1384, 10:32 صبح
آقای tami_1369، لطفا اینقدر تو این تاپیک off topic نزن. یک بار خواهش کردی که آقای Gladiator ادامه بده، مطمئنا ایشون هم پست شما رو خوند، لازم نیست دائما خواهش خودتون رو تکرار کنید!!

Gladiator
دوشنبه 27 تیر 1384, 11:19 صبح
سلام

ادامه رو هم مینویسم .

tanha_m
سه شنبه 28 تیر 1384, 10:48 صبح
سلام به Gladiator عزیز
از مطالب جالب و مفید شما استفاده کردم
خیلی جالب بود امیدوارم که همیشه و در همه حال خوش و دریایی باشید .

tami_1369
جمعه 21 مرداد 1384, 06:27 صبح
اه ...
بابا چی شد ؟؟؟

kimiya_aaa
شنبه 09 مهر 1384, 23:27 عصر
پورت 88000 وجود خارجی ندارد و زمانی که شما مقدار مربوطه که از مقدار 16 بیتی فاقد علامت WORD بیشتر میشود تنها دو بایت اول انتقال پیدا می کند نه بایت های سوم و چهارم... به عبارت بهتر چون چنین پورتی وجود خارجی ندارد (65535 تا 1) سرریز مقادیر عدد کاذب ایجاد می کند!

کسی که با ایندی کار می کند باید کمی شبکه هم بلد باشد!

Bahmany
چهارشنبه 28 دی 1384, 23:58 عصر
http://www.indyproject.org/Sockets/Docs/index.en.html

Ehsansh
دوشنبه 24 بهمن 1384, 19:18 عصر
گلادی جان یک سوال :
چرا وقتی برنامه client را connect می کنیم فایروال پورت 22464 را نشون میده ؟ مگه پورت روی 88000 ست نیست ؟؟؟
:گیج:

تعداد پورتها در شبکه حداکثر 65536 تاست و وقتی پورت ما بیشتر از این باشد سرریز میکند و نتیجه:
22464=65536-88000

eshaghrahimy
دوشنبه 04 اردیبهشت 1385, 03:51 صبح
مرسی اقای گلادیاتور

FPGAINTEL
سه شنبه 05 اردیبهشت 1385, 09:29 صبح
سلام
چطور می توان در readln در client indy یک رویداد ایجاد کرد

eshaghrahimy
جمعه 15 اردیبهشت 1385, 00:49 صبح
با سلام اقای گلادیاتور چرا این بخش رو ادامه نمیدین من نیاز فوری به این بخش دارم

eshaghrahimy
جمعه 15 اردیبهشت 1385, 00:53 صبح
با سلام اقای گلادیاتور لطفا فایل پیوست مربوط به برنامه چت سرور را در اختیار ما بگذارید

dkhatibi
دوشنبه 18 اردیبهشت 1385, 15:25 عصر
در مورد فرستادن میل بنده تمام انچه گفته بودید انجام دادم
اما در هنگام فرستادن میل فقط برنامه قفل می شود اما هیچ کاری انجام نمی شود نه خطایی می دهد نه میلی فرستاده می شود.

dkhatibi
دوشنبه 18 اردیبهشت 1385, 18:41 عصر
شاید هم بعد از 10 دقیقه این پیام رو بده
Connection reset by peer

syrp64
چهارشنبه 18 مرداد 1385, 13:45 عصر
خیلی ممنون آقای Gladiator

eshaghrahimy
جمعه 20 مرداد 1385, 06:43 صبح
چرا دیگه ادامه نمیدین

eshaghrahimy
پنج شنبه 16 شهریور 1385, 08:38 صبح
پس چرا دیگه ادامه نمیدین

Mahdi_S_T
جمعه 17 شهریور 1385, 07:15 صبح
دوست من آخرین پست معتبر مربوط به این تاپیک در 12 مهر 1384 بوده و این تاپیک دیگه فعال نیست چون از گلادیاتور هم خیلی وقت است که خبری نیست .
موفق باشی

eshaghrahimy
سه شنبه 28 شهریور 1385, 15:24 عصر
ممنون که گفتی ولی اگه هر کی میتونه ادامه بده

amin a.^2
چهارشنبه 29 شهریور 1385, 15:10 عصر
ممنون که گفتی ولی اگه هر کی میتونه ادامه بده
موافقم یعنی هیچ کسی تو انجمن نیست که این راهو ادامه بده

ali_divsalar
سه شنبه 01 آبان 1386, 10:25 صبح
یه برنامه نوشتم که فایل متن حاوی اطلاعات هر فرد رو بطور خودکار به آدرس همون فرد بفرسته
این کار بدرستی انجام می شه. ولی اگه بخوام با دو email پشت سرهم فایلی را برای یکی بفرستم، (دو فایل ) در ( یک email ) ارسال می شه.

vcldeveloper
سه شنبه 01 آبان 1386, 23:43 عصر
یه برنامه نوشتم که فایل متن حاوی اطلاعات هر فرد رو بطور خودکار به آدرس همون فرد بفرسته
این کار بدرستی انجام می شه. ولی اگه بخوام با دو email پشت سرهم فایلی را برای یکی بفرستم، (دو فایل ) در ( یک email ) ارسال می شه.
باید نمونه کدی، چیزی بزارید که بشه اشکال کار رو پیدا کرد.

ali_divsalar
شنبه 05 آبان 1386, 08:08 صبح
متن procedure مربوطه رو خلاصه و در ضمیمه کردم .(ضمنا از نمونه برنامه دلفی 6 استفاده شده)

ParsaNM
پنج شنبه 03 مرداد 1387, 10:45 صبح
با تشکر از دوستان و Indy کاران عزيز...
من يک مشکل با Indy دارم اميدوارم بتونين کمکم کنين...
من يک برنامه شبيه outlook نوشتم درستم کار ميکنه مشکلم تو دريافته روش اينه که IDpop3 دارم کار ارتباط رو انجام ميده Mail جديد رو با TIdMessage دريافت ميکنم و اون رو تو يه database ذخيره ميکنم ... تا اينجا مشکلي نيست ... مشکل از جايي شروع ميشه که من body رو ذخيره ميکنم .. ميدونم که ContentType مدل هاي مختلفي رو از يک Mail معرفي ميکنه و منم اونها رو Handle مي کنم و نهايتا يک HTML Source دارم که اون رو تو يک Temp file ذخيره ميکنم و با TWebBrowser نمايش مي دم حالا اولا بعضي از فونت هاي فارسي درست نمياد ... چطور ميشه Encoding رو عوض کرد ؟ و دوما اين body کامل نيست مخصوصا تو mail هايي که عکس دارن ....

vcldeveloper
پنج شنبه 03 مرداد 1387, 15:23 عصر
چطور ميشه Encoding رو عوض کرد ؟
Encoding چی رو؟ فایل HTML ایی که از ای میل استخراج کردید و در WebBrowser نمایش می دید؟
اگر منظور همین هست؛ با استفاده از خصوصیت Document.Charset از WebBrowser می تونید Encoding متن نمایش داده شده را تغییر بدید:


Variant(WebBrowser1.Document).Charset := 'UTF-8';

دوما اين body کامل نيست مخصوصا تو mail هايي که عکس دارن ....
کامل نیست، یعنی چجوری هست؟

ParsaNM
یک شنبه 06 مرداد 1387, 12:42 عصر
جناب کشاورز ،
اولا از پاسخ شما ممنونم ... مشکلم با با encoding طبق روش شما درست شد.
دوما مشکل اينجاست که عکسها را با خود فايل نميفرستد (البته من اينجور فکر ميکنم)
جاي عکسها خالي ميايد دقيقا مشابه وقتي که اینترنت اکسپلور عکس را باز نمي کند و بايد
Show Picture را کليک کنيم ... حتي اين گزينه در منو راست کليک فعال مي باشد با اين تفاوت که کار نميکنه ...!

vcldeveloper
یک شنبه 06 مرداد 1387, 19:25 عصر
دوما مشکل اينجاست که عکسها را با خود فايل نميفرستد (البته من اينجور فکر ميکنم)
جاي عکسها خالي ميايد دقيقا مشابه وقتي که اینترنت اکسپلور عکس را باز نمي کند و بايد
Show Picture را کليک کنيم ... حتي اين گزينه در منو راست کليک فعال مي باشد با اين تفاوت که کار نميکنه ...!
خب اینکه طبیعی هست! وقتی میگید ای میل بصورت HTML ارسال بشه، یعنی یک فایل HTML، تصاویر جزو فایل HTML نیستند. اگر با Outlook هم ای میلی بصورت HTML بفرستید، به همین شکل ارسال میشه.
برای فایل های غیر متنی، باید از Attachment استفاده کنید، یا آن تصویر در اینترنت موجود باشد تا مرورگر از روی لینک آن را لود کند.

gholami146
چهارشنبه 11 بهمن 1391, 17:38 عصر
با سلام
من تا اینجا تاپیک ها را مو به مو دنبال کردم
اولا سئوالات خارج از این تاپیک بسیار زیاده
دوما کد های داده شده تست نشده است و گویا از روی بخشی از اطلاعات نوشتاری کسی در حال ترجمه می باشد (با عرض پوزش از گلادیاتور عزیز)
ولی خوب همین که یک نفر قدم جلو گذاشته و یک سری مقاله رو داره اینجا آموزش میده خیلی نشونه خوبیه و بنظر من تازه این یعنی سایت برنامه نویس
ضمنا از دوستان خواهشمند هستم اول تاپیک را از ابتدا تا انتها مرور کنن سپس سئوالات خود را مطرح کنن
چون آقای گلادیاتور در بین آموزش ها بعد از پاسخ گویی به سئوالات شما متن کلام از دستشون خارج و به موضوعاتی اشاره میکنن که بسیار گنگ می باشد
بطور مثال در ابتدای آموزش ها بطور ناگهانی به سمت توضیح ارسال ایمیل با کامپوننت ایندی رفتن در صورتی که قرار بود ایشون برنامه ای رو برای ارسال نوشتار بین دو کامپیوتر اماده کنن
ببخشید اگر ناراحت شدید

Felony
پنج شنبه 12 بهمن 1391, 06:16 صبح
با سلام
من تا اینجا تاپیک ها را مو به مو دنبال کردم
اولا سئوالات خارج از این تاپیک بسیار زیاده
دوما کد های داده شده تست نشده است و گویا از روی بخشی از اطلاعات نوشتاری کسی در حال ترجمه می باشد (با عرض پوزش از گلادیاتور عزیز)
ولی خوب همین که یک نفر قدم جلو گذاشته و یک سری مقاله رو داره اینجا آموزش میده خیلی نشونه خوبیه و بنظر من تازه این یعنی سایت برنامه نویس
ضمنا از دوستان خواهشمند هستم اول تاپیک را از ابتدا تا انتها مرور کنن سپس سئوالات خود را مطرح کنن
چون آقای گلادیاتور در بین آموزش ها بعد از پاسخ گویی به سئوالات شما متن کلام از دستشون خارج و به موضوعاتی اشاره میکنن که بسیار گنگ می باشد
بطور مثال در ابتدای آموزش ها بطور ناگهانی به سمت توضیح ارسال ایمیل با کامپوننت ایندی رفتن در صورتی که قرار بود ایشون برنامه ای رو برای ارسال نوشتار بین دو کامپیوتر اماده کنن
ببخشید اگر ناراحت شدید
به تاریخ ایجاد تاپیک و پست ها یه نگاهی بکن ...