# Native Code > برنامه نویسی در Delphi > توسعه نرم افزارهای تحت شبکه >  همه چیز درباره Indy

## Gladiator

با سلام ؛

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

کلاینت :

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

with IndyClient do begin
Host &#58;= 'IndyServer.Barnamenevis.org';
آدرس سروری که میبایست به آن متصل شد .
Port &#58;= 6000;
شماره پورتی که کلاینت باید به آن متصل شود .
Connect; Try
اقدام جهت برقراری ارتباط .
finally Disconnect; end;
و در نهایت قطع ارتباط
end;

----------


## Gladiator

توضیحات درباره کلاینت ؛

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

----------


## Gladiator

سرور :

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

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

----------


## vcldeveloper

:flower:   :تشویق:  
امیدوارم ادامه داشته باشه!

انشاء الله!

----------


## Gladiator

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

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

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

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

----------


## said ali

با سلام
با تشکر ادامه بدید :flower:  :flower:  :flower:  :wink:

----------


## Gladiator

Blocking :

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

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

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

----------


## Gladiator

Non Blocking :

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

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

----------


## hr110

:تشویق:   :flower:  :kiss: 
اگه ممکنه در مورد threadهای سمت سرور هم کمی توضیح بدهید، توضیح در مورد اینکه چگونه این کار انجام میشود و چطور میتوان آن را پیاده نموده

----------


## _alish_

خیلی جالب شد 
لطفا یک مثال کوچک همراه با توضیح بیاورید :flower:   :تشویق:

----------


## Gladiator

> :flower:  :kiss: 
> اگه ممکنه در مورد threadهای سمت سرور هم کمی توضیح بدهید، توضیح در مورد اینکه چگونه این کار انجام میشود و چطور میتوان آن را پیاده نموده


با سلام ؛

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

----------


## _alish_

بابا دمت گرم تو دیگه کی هستی بابا تو دیگه کی هستی ....
موفق باشی دوست عزیز :flower:   :تشویق:

----------


## Gladiator

مشکل Freeze در کلاینتها :

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

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

----------


## Gladiator

حل مشکل Freeze شدن کلاینتها :

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

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

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

----------


## Gladiator

Non Blocking  مشکل Freeze را ندارد :

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

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

----------


## jirjirakk

گلادیاتور جان ناز نفست :: کار واقعا باحالی رو شروع کردی :)
میشه یه توضیح هم بدی از هر کدوم از این دو روش چه موقعی باید استفاده کنیم، یا اینکه کدوم روش بهتر هستش  :flower: 

 :heart:

----------


## Gladiator

مثال عملی :

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

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

و اما مثال :

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

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

procedure TForm1.Button1Click&#40;Sender&#58; TObject&#41;;
var
s&#58; string;
begin
s &#58;= 'Welcome To Barnamenevis.org , Stay and Enjoy' + #13#10;

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

try
with TFileStream.Create&#40;'c&#58;\Barnamenevis\test.d  at', fmCreate&#41; do try

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

WriteBuffer&#40;s&#91;1&#93;, Length&#40;s&#41;&#41;;

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

finally Free; end;
end;
end;

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

----------


## Gladiator

حالا برای انجام همان کار در مدل برنامه نویسی Non Blocking به این شکل عمل میکنیم :

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

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

procedure TForm1.Button1Click&#40;Sender&#58; TObject&#41;;
begin
File1.Filename &#58;= 'c&#58;\Barnamenevis\test.dat';
File1.Open;
end;

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

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

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

procedure TForm1.File1OnWrite&#40;Sender&#58; TObject&#41;;
var
i&#58; integer;
begin
i &#58;= File1.Write&#40;FWriteData&#41;;
Delete&#40;FWriteData, 1, i&#41;;
if Length&#40;FWriteData&#41; = 0 then begin
File1.Close;
end;
end;

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

procedure TForm1.File1OnClose&#40;Sender&#58; TObject&#41;;
begin
Button1.Enabled &#58;= True;
end;

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

----------


## Gladiator

لازم میدونم یک سری توضیحات کوتاهی رو در مورد مثال دوم بنویسم .

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

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

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

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

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

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

----------


## Gladiator

در ادامه جهت معرفی دو کامپوننت IdTcpServer و IdTcpClient از مجموعه کامپوننتهای Indy نمونه برنامه ای را ارائه خواهم کرد و سپس مرحله به مرحله بروی برنامه به معرفی کامپوننتها خواهیم پرداخت .

----------


## vcldeveloper

آقای گلادیاتور...مرسی  :flower:

----------


## Gladiator

با سلام مجدد ؛

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

----------


## Gladiator

در این مرحله میخوایم برنامه ای رو بصورت سرور / کلاینت بنویسیم که از طریق این برنامه بتونیم از روی کامپیوترهایی که برنامه کلاینت بروی اونها در حال اجراست Screen Shot هایی رو تهیه کنیم و به سرور ارسال کنیم .

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

----------


## Mahdi_S_T

قبلا من در مورد برنامه کافی نت از جناب gladiator راهنمایی خواستم . ظاهرا این تاپیک جواب خوبی برای من است . از زحمات جنابعالی کمال تشکر را دارم  :flower:  :heart:

----------


## jirjirakk

گلادیاتور جان منم این کارو قبلا انجام دادم و سورسش و اینجا قرار میدم

----------


## Mahdi_S_T

چی شد ؟ دیگه خبری نیست !!؟

----------


## Gladiator

> چی شد ؟ دیگه خبری نیست !!؟


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

 :flower:

----------


## Gladiator

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

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

----------


## Gladiator

if SMTP.Connected=false then begin
  SMTP.Host&#58;='mail.barnamenevis.org';
  SMTP.Port&#58;=25;
  SMTP.Username&#58;='MySMTPMailAccount';
  SMTP.Password&#58;='MySMTPMailPassword';
  SMTP.Connect;
  MyMessage.Body.Text&#58;=Memo1.Text;
  MyMessage.From.Address&#58;='Gladiator@Barnamenevi  s.org';
  MyMessage.Recipients.EMailAddresses&#58;=edit1.Tex  t;
  MyMessage.Subject&#58;=edit2.Text;
  TIdAttachment.Create&#40;MyMessage.MessageParts,Op  enDialog1.FileName&#41;;
  SMTP.Send&#40;MyMessage&#41;;
end
else
begin
  MyMessage.Body.Text&#58;=Memo1.Text;
  MyMessage.From.Address&#58;='Gladiator@barnamenevi  s.org';
  MyMessage.Recipients.EMailAddresses&#58;=edit1.Tex  t;
  MyMessage.Subject&#58;=edit2.Text;
  TIdAttachment.Create&#40;MyMessage.MessageParts,Op  enDialog1.FileName&#41;;  
  SMTP.Send&#40;MyMessage&#41;;
end;

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

IdSMTP.Host&#58;='YourHostname or IPAddress';
IdSMTP.Port&#58;=25;

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

ادامه دارد .

----------


## Gladiator

IdSMTP.Username&#58;='MyUsername';
در این قسمت خودتون رو به سرور معرفی میکنید .

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

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

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

----------


## Gladiator

MyMessage.Body.Text&#58;=Memo1.Text; 
  MyMessage.From.Address&#58;='Gladiator@barnamenevi  s.org'; 
  MyMessage.Recipients.EMailAddresses&#58;=edit1.Tex  t; 
  MyMessage.Subject&#58;=edit2.Text; 
  TIdAttachment.Create&#40;MyMessage.MessageParts,Op  enDialog1.FileName&#41;;  
  SMTP.Send&#40;MyMessage&#41;;

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

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

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

MyMessage.From.Address&#58;='Gladiator@barnamenevi  s.org';
براش مشخص میکنیم که نامه از طرف چه کسی ارسال شده .

MyMessage.Recipients.EMailAddresses&#58;=edit1.Tex  t; 
مشخص میکنیم که نامه به چه آدرس یا آدرسهایی باید ارسال بشه .

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

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

TIdAttachment.Create&#40;TidMessage.MessageParts,O  penDialog1.FileName&#41;; 

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

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

TidSMTP.Send&#40;IdMessage&#41;;

----------


## Gladiator

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

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

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

----------


## Delphi Skyline

آقای gladiator من یدونه کامپیوتر دارم (Windows XP Media Editon 2005) و نمی خوام serverم تحت اینترنت باشه . آیا می شه من تو کامپیوترم یک Server درست کنم برای خودم . و حتی یک client . یعنی من هم بشم کاربر و هم Admin و بعد هم می خوام دیتابیسی باشه (With ACCESS) . بای (البته اینا برای یادگیری بود)

----------


## Gladiator

من دقیقا متوجه نشدم که چی میخوای !

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

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

----------


## Delphi Skyline

خوب بعد نام server یا همان server name رو چی بزنم .
و بعد چه طوری یک user براش تعریف کنم ؟

----------


## Delphi Skyline

راسی آقای gladiator در مورد idsmtp . من هر وقت می خوام باهش کاننکت بشم error می زنه . ایمیلم هم با yahoo می زنم .

----------


## Gladiator

یکبار از اول همه مطالب رو بخون متوجه میشی .

----------


## vcldeveloper

> راسی آقای gladiator در مورد idsmtp . من هر وقت می خوام باهش کاننکت بشم error می زنه . ایمیلم هم با yahoo می زنم .


با اجازه از Gladiator عزیز، 
عزیز جان، اسم کامپوننت هست id*SMTP* برای ای میلهای رایگان Yahoo نمی تونید از پروتکل های SMTP/POP3 استفاده کنید! (فکر کنم قبلا 16صد بار اینو گفتیم :wink: )

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

----------


## Delphi Skyline

پس آقای کشاورز یه دو تا سایت بگید که SMTP باشن برای ایمیلش . آقای کشاورز Yahoo پاپ 3 است ؟
اگر هست توی خود INDY همچین کامپاننتی هست؟

----------


## houshmand

> آقای کشاورز Yahoo پاپ 3 است ؟


سرویس رایگان نه ولی پولی داره




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


*gmail*    :wink: رایگان داره

----------


## پریسا نامدار

من هم واقعا به این بحث شیرین علاقه مند شدم و از آقای گلادیاتور عزیز تشکر و قدردانی میکنم.
امیدوارم که این بحث رو همچنان و بر سرعت بیشتر ادامه بدن تا هم من و بقیه اعضای سایت بتونیم استفاده های عملی و مثبتی از اون بکنیم.
 :flower:

----------


## Gladiator

برای شروع کار بروی کامپوننتهای IdTcpClient , IdTcpServer ساده ترین نمونه برنامه رو آماده کردم ٬ توضیحات برنامه رو مینویسم .

----------


## Gladiator

این برنامه ساده از دو قسمت سرور و کلاینت تشکیل شده ٬ در حقیقت دو برنامه داریم که از طریق سوکتها و پروتوکل TCP/IP با هم ارتباط برقرار میکنند .

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

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

ادامه دارد .

----------


## majid_n

مرسی گلادی جان ادامه بده  :flower:

----------


## Gladiator

در سمت سرور ٬ ابتدا IdTcpServer را setup میکنیم :

Memo1.clear;
IdTCPServer1.DefaultPort&#58;=88000;
IdTCPServer1.MaxConnections&#58;=100;
IdTCPServer1.Active&#58;=true;

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

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

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

1) OnConnect
2) OnDisconnect
3) OnExecute

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

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

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

Memo1.Lines.Add&#40;AThread.Connection.Socket.Bind  ing.PeerIP + ' loged in'&#41;;
Memo1.Update;

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

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

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

Memo1.Lines.Add&#40;AThread.Connection.Socket.Bind  ing.PeerIP + ' Loged out.'&#41;;
Memo1.Update;

AThread.Connection.Socket.Binding.PeerIP 

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

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

Memo1.Lines.Add&#40;AThread.Connection.Socket.Bind  ing.PeerIP + ' &#58; ' + AThread.Connection.ReadLn&#41;;
Memo1.Update;

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

----------


## Delphi Skyline

آقای GLADIATOR این برنامه بدون هیچ نیازی به چیزی که رو سیستم نصب بشه کار می کنه ؟
یعنی من می تونم با WINDOWS XP و بدون هیچ چیز ازش استفاده کنم ؟
آخه به من می گه :

Connected Time Out

----------


## vcldeveloper

> این برنامه بدون هیچ نیازی به چیزی که رو سیستم نصب بشه کار می کنه ؟ 
> یعنی من می تونم با WINDOWS XP و بدون هیچ چیز ازش استفاده کنم ؟


بله، نیاز به چیزی نداره.




> آخه به من می گه : 
> 
> 
> Connected Time Out


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

----------


## majid_n

گلادی جان یک سوال :
چرا وقتی برنامه  client را connect  می کنیم فایروال پورت 22464 را نشون میده ؟ مگه پورت روی 88000 ست نیست ؟؟؟ 
 :گیج:

----------


## Gladiator

> چرا وقتی برنامه client را connect می کنیم فایروال پورت 22464 را نشون میده ؟ مگه پورت روی 88000 ست نیست ؟؟؟


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

----------


## Delphi Skyline

چه طوری می شه یک برنامه چت ساخت . یعنی دو طرفه باشه . یعنی طرف اول هم بگیره و هم ارسال کنه و طرف دوم هم به همین صورت .. ؟   :گیج:   :گیج:   :گیج:   :گیج:   :گیج:   :گیج:   :گیج:

----------


## vcldeveloper

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


هر دو کامپوننت IdTcpClient , IdTcpServer رو در یک برنامه استفاده کن و اونها رو براساس اطلاعاتی که قبلا در همین تاپیک Gladiator زحمت کشیده و اراپه کرده، تنظیم کن.

----------


## Gladiator

با سلام خدمت استاد عزیز آقای کشاورز .

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

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

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

موفق باشید .

----------


## Delphi Skyline

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

----------


## Gladiator

با IdTcpClient هم میتونی پیام به سرور ارسال کنی و هم از سرور پیام دریافت کنی .

موفق باشی .

----------


## Delphi Skyline

متشکرم

----------


## vcldeveloper

> پس چی شد آقای گلادیاتور .


با اجازه از سرور گرامی آقای Gladiator :



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

----------


## صنم

سلام
میشه یه برنامه بانک اطلاعاتی ساده رو مثال بزنید که روی سرور نصب بشه و از طریق کلاینت بشه اون رو اجرا کرد . ممنون :embr:

----------


## Gladiator

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


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

موفق باشی .

----------


## Gladiator

حالا وقتش رسیده که نشون بدیم چطوری میتونیم بوسیله این کامپوننتها فایلی را بین 2 کامپیوتر منتقل کنیم .

----------


## Delphi Skyline

آقای گلادیاتور تو این کارا get way نمی خواهد

----------


## صنم

[quote="Gladiator"]


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


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

----------


## majid_n

> چرا وقتی برنامه client را connect می کنیم فایروال پورت 22464 را نشون میده ؟ مگه پورت روی 88000 ست نیست ؟؟؟
> 			
> 		
> 
> مطمئنی که پورت رو عوض نکردی ؟ من که همچین چیزی ندیدم .


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

----------


## Delphi Skyline

با اجازه آقای گلادیاتور . اگر می شه میخواهم در مورد نحوه ساخت مسنجر ساده صحبت کنم .
برای نوشتن یک برنامه چت باید از 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&#40;TForm&#41;
    Memo1&#58; TMemo;
    Button1&#58; TButton;
    Edit1&#58; TEdit;
    client1&#58; TIdTCPClient;
    server1&#58; TIdTCPServer;
    Button3&#58; TButton;
    Button4&#58; TButton;
    IdThreadMgrDefault1&#58; TIdThreadMgrDefault;
    SkinData1&#58; TSkinData;
    GroupBox1&#58; TGroupBox;
    Memo2&#58; TMemo;
    suiSkinEngine1&#58; TsuiSkinEngine;
    Button6&#58; TButton;
    Label1&#58; TLabel;
    Timer1&#58; TTimer;
    Button2&#58; TButton;
    Button5&#58; TButton;
    SaveDialog1&#58; TSaveDialog;
    procedure Button3Click&#40;Sender&#58; TObject&#41;;
    procedure Button4Click&#40;Sender&#58; TObject&#41;;
    procedure server1Connect&#40;AThread&#58; TIdPeerThread&#41;;
    procedure server1Disconnect&#40;AThread&#58; TIdPeerThread&#41;;
    procedure server1Execute&#40;AThread&#58; TIdPeerThread&#41;;
    procedure Button1Click&#40;Sender&#58; TObject&#41;;
    procedure Button6Click&#40;Sender&#58; TObject&#41;;
    procedure Timer1Timer&#40;Sender&#58; TObject&#41;;
    procedure Button2Click&#40;Sender&#58; TObject&#41;;
    procedure Button5Click&#40;Sender&#58; TObject&#41;;
    procedure FormClose&#40;Sender&#58; TObject; var Action&#58; TCloseAction&#41;;
  private
    &#123; Private declarations &#125;
  public
    &#123; Public declarations &#125;
  end;

var
  Form1&#58; TForm1;

implementation

uses Unit2;

&#123;$R *.dfm&#125;

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

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

procedure TForm1.server1Connect&#40;AThread&#58; TIdPeerThread&#41;;
begin
if form2.CheckBox1.Checked=true then
begin
memo1.Lines.Add&#40;AThread.Connection.Socket.Bind  ing.IP+' &#58; '+'وصل شد'&#41;;
end
else
memo1.Lines.Add&#40;form2.Edit2.Text+' &#58; '+'وصل شد'&#41;;
end;

procedure TForm1.server1Disconnect&#40;AThread&#58; TIdPeerThread&#41;;
begin
if form2.CheckBox1.Checked=true then
begin
memo1.Lines.Add&#40;AThread.Connection.Socket.Bind  ing.IP+' &#58; '+'ارتباط را قطع کرد'&#41;;
end
else
memo1.Lines.Add&#40;form2.Edit2.Text+' &#58; '+'ارتباط را قطع کرد'&#41;;
end;

procedure TForm1.server1Execute&#40;AThread&#58; TIdPeerThread&#41;;
begin
if form2.CheckBox1.Checked=true then
begin
memo1.Lines.Add&#40;AThread.Connection.Socket.Bind  ing.PeerIP+' &#58; '+AThread.Connection.ReadLn&#41;;
end
else
memo1.Lines.Add&#40;form2.Edit2.Text+' &#58; '+AThread.Connection.ReadLn&#41;;
end;

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

 end;

procedure TForm1.Button6Click&#40;Sender&#58; TObject&#41;;
begin
//memo1.Lines.Add&#40;client1.ReadLn&#41;;
form2.ShowModal;
end;

procedure TForm1.Timer1Timer&#40;Sender&#58; TObject&#41;;
begin
if client1.Connected=true then
 begin
  label1.Caption&#58;='شما وصل هستید';
 end
 else
    label1.Caption&#58;='شما وصل نیستید';
end;

procedure TForm1.Button2Click&#40;Sender&#58; TObject&#41;;
begin
server1.Active&#58;=false;
application.Terminate;
end;

procedure TForm1.Button5Click&#40;Sender&#58; TObject&#41;;
begin
savedialog1.Execute;
memo1.Lines.SaveToFile&#40;savedialog1.FileName+'.  txt'&#41;;
showmessage&#40;'               ذخیره شد               '&#41;;
end;

procedure TForm1.FormClose&#40;Sender&#58; TObject; var Action&#58; TCloseAction&#41;;
begin
server1.Active&#58;=false;
application.Terminate;
end;

end.




form 2
unit Unit2;

interface

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

type
  TForm2 = class&#40;TForm&#41;
    Label1&#58; TLabel;
    Label2&#58; TLabel;
    CheckBox1&#58; TCheckBox;
    Label3&#58; TLabel;
    Label4&#58; TLabel;
    Edit1&#58; TEdit;
    Edit2&#58; TEdit;
    Edit3&#58; TEdit;
    Edit4&#58; TEdit;
    Button1&#58; TButton;
    Button2&#58; TButton;
    Label5&#58; TLabel;
    Edit5&#58; TEdit;
    Button3&#58; TButton;
    procedure Button2Click&#40;Sender&#58; TObject&#41;;
    procedure Button1Click&#40;Sender&#58; TObject&#41;;
    procedure Button3Click&#40;Sender&#58; TObject&#41;;
  private
    &#123; Private declarations &#125;
  public
    &#123; Public declarations &#125;
  end;

var
  Form2&#58; TForm2;

implementation

uses Unit1;

&#123;$R *.dfm&#125;

procedure TForm2.Button2Click&#40;Sender&#58; TObject&#41;;
begin
edit1.Clear;
edit2.Clear;
edit3.Clear;
edit4.Clear;
close;
end;

procedure TForm2.Button1Click&#40;Sender&#58; TObject&#41;;
begin
form1.server1.DefaultPort&#58;=strtoint&#40;edit4.  Text&#41;;
form1.server1.MaxConnections&#58;=100;
form1.server1.Active&#58;=true;
close;
end;

procedure TForm2.Button3Click&#40;Sender&#58; TObject&#41;;
var i&#58;string;
begin
i&#58;=edit4.Text;
edit4.Text&#58;=edit3.Text;
edit3.Text&#58;=i;
end;

end.


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

----------


## nassim_20

دوستان یه سوال داشتم:
با کامپوننتهای Indy میشه یه برنامه مثل HyperTerminal نوشت 
اگه ممکنه یه کمی در این رابطه توضیح دهید 
ممنون از لطف همه دوستان عزیر.

----------


## Gladiator

> دوستان یه سوال داشتم:
> با کامپوننتهای Indy میشه یه برنامه مثل HyperTerminal نوشت 
> اگه ممکنه یه کمی در این رابطه توضیح دهید 
> ممنون از لطف همه دوستان عزیر.


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

----------


## دنیای دلفی

جناب آقای گلادیاتور سلام و خسته نباشید 

من از برنامه ارسال Email شما استفاده کردم و تنظیمات آن را به صورت زیر قرار دادم ولی خطای پایین را می دهد به نظر شما مشکل از چیست :
SMTP.Host&#58;='smtp.gmail.com';
  SMTP.Port&#58;=587;
  SMTP.Username&#58;='grshn1';
  SMTP.Password&#58;='154559665';
  SMTP.Connect;
  MyMessage.Body.Text&#58;=Memo1.Text;
  MyMessage.From.Address&#58;='grshn1@gmail.com';

----------


## دنیای دلفی

ضمنا این حالت را هم بررسی کردم ولی جواب نداد :
SMTP.Host&#58;='smtp.gmail.com'; 
  SMTP.Port&#58;=465; 
  SMTP.Username&#58;='grshn1@gmail.com'; 
  SMTP.Password&#58;='154559665'; 
  SMTP.Connect; 
  MyMessage.Body.Text&#58;=Memo1.Text; 
  MyMessage.From.Address&#58;='grshn1@gmail.com';

----------


## Gladiator

به Authentication نیاز داری برای اتصال به SMTP سرور Gmail .

----------


## دنیای دلفی

> به Authentication نیاز داری برای اتصال به SMTP سرور Gmail .


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

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

----------


## nassim_20

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


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

----------


## vcldeveloper

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


تاپیک های زیادی در مورد کامپوننت KDTele ایجاد شده، می تونید در سایت بدنبال کلمه KDTele بگردید.

----------


## tami_1369

خیلی کارت درسته گلادیاتور...

----------


## MSK

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

متشکر

----------


## tami_1369

آقا ادامه بده دیگه !!! اه ...

----------


## tami_1369

چی شد؟؟؟نکنه تموم شد دیگه!!!!
من از چیزی سر در نیاوردم.

----------


## vcldeveloper

آقای tami_1369، لطفا اینقدر تو این تاپیک off topic نزن. یک بار خواهش کردی که آقای Gladiator ادامه بده، مطمئنا ایشون هم پست شما رو خوند، لازم نیست دائما خواهش خودتون رو تکرار کنید!!

----------


## Gladiator

سلام

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

----------


## tanha_m

سلام به  Gladiator عزیز
از مطالب جالب و مفید شما استفاده کردم
خیلی جالب بود  امیدوارم که همیشه و در همه حال خوش و دریایی باشید .

----------


## tami_1369

اه ...
بابا چی شد ؟؟؟

----------


## kimiya_aaa

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

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

----------


## Bahmany

http://www.indyproject.org/Sockets/Docs/index.en.html

----------


## Ehsansh

> گلادی جان یک سوال :
> چرا وقتی برنامه  client را connect  می کنیم فایروال پورت 22464 را نشون میده ؟ مگه پورت روی 88000 ست نیست ؟؟؟


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

----------


## eshaghrahimy

مرسی اقای گلادیاتور

----------


## FPGAINTEL

سلام 
چطور می توان در readln در client indy یک رویداد ایجاد کرد

----------


## eshaghrahimy

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

----------


## eshaghrahimy

با سلام اقای گلادیاتور لطفا فایل پیوست مربوط به برنامه چت سرور را در اختیار ما بگذارید

----------


## dkhatibi

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

----------


## dkhatibi

شاید هم بعد از 10 دقیقه این پیام رو بده
Connection reset by peer

----------


## syrp64

خیلی ممنون آقای Gladiator

----------


## eshaghrahimy

چرا دیگه ادامه نمیدین

----------


## eshaghrahimy

پس چرا دیگه ادامه نمیدین

----------


## Mahdi_S_T

دوست من آخرین پست معتبر مربوط به این تاپیک در  12 مهر 1384 بوده و این تاپیک دیگه فعال نیست چون از گلادیاتور هم خیلی وقت است که خبری نیست . 
موفق باشی

----------


## eshaghrahimy

ممنون که گفتی ولی اگه هر کی میتونه ادامه بده

----------


## amin a.^2

> ممنون که گفتی ولی اگه هر کی میتونه ادامه بده


موافقم یعنی هیچ کسی تو انجمن نیست که این راهو ادامه بده

----------


## ali_divsalar

یه برنامه نوشتم که فایل متن حاوی اطلاعات هر فرد رو بطور خودکار به آدرس همون فرد بفرسته
این کار بدرستی انجام می شه.  ولی اگه بخوام با دو email پشت سرهم فایلی را برای یکی بفرستم، (دو فایل ) در ( یک email ) ارسال می شه.

----------


## vcldeveloper

> یه برنامه نوشتم که فایل متن حاوی اطلاعات هر فرد رو بطور خودکار به آدرس همون فرد بفرسته
> این کار بدرستی انجام می شه. ولی اگه بخوام با دو email پشت سرهم فایلی را برای یکی بفرستم، (دو فایل ) در ( یک email ) ارسال می شه.


باید نمونه کدی، چیزی بزارید که بشه اشکال کار رو پیدا کرد.

----------


## ali_divsalar

متن procedure مربوطه رو خلاصه و در ضمیمه کردم .(ضمنا از نمونه برنامه دلفی 6 استفاده شده)

----------


## ParsaNM

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

----------


## vcldeveloper

> چطور ميشه Encoding رو عوض کرد ؟


Encoding چی رو؟ فایل HTML ایی که از ای میل استخراج کردید و در WebBrowser نمایش می دید؟
اگر منظور همین هست؛ با استفاده از خصوصیت Document.Charset از WebBrowser می تونید Encoding متن نمایش داده شده را تغییر بدید:

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



> دوما اين body کامل نيست مخصوصا تو mail هايي که عکس دارن ....


کامل نیست، یعنی چجوری هست؟

----------


## ParsaNM

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

----------


## vcldeveloper

> دوما مشکل اينجاست که عکسها را با خود فايل نميفرستد (البته من اينجور فکر ميکنم)
> جاي عکسها خالي ميايد  دقيقا مشابه وقتي که اینترنت اکسپلور عکس را باز نمي کند و بايد 
> Show Picture را کليک کنيم ... حتي اين گزينه در منو راست کليک فعال مي باشد با اين تفاوت که کار نميکنه ...!


خب اینکه طبیعی هست! وقتی میگید ای میل بصورت HTML ارسال بشه، یعنی یک فایل HTML، تصاویر جزو فایل HTML نیستند. اگر با Outlook هم ای میلی بصورت HTML بفرستید، به همین شکل ارسال میشه.
برای فایل های غیر متنی، باید از Attachment استفاده کنید، یا آن تصویر در اینترنت موجود باشد تا مرورگر از روی لینک آن را لود کند.

----------


## gholami146

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

----------


## Felony

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


به تاریخ ایجاد تاپیک و پست ها یه نگاهی بکن ...

----------

