# Native Code > برنامه نویسی در Delphi > مقالات مرتبط با Delphi/Win32 >  indy

## aserfg

*با توجه به اینکه مطالبی که راجع به* *indy**در سایت وجود داره مخصوصا مطالب آقای گلادیاتور ولی باز هم به دلیل جذابیت خواستم مطالب بیشتری رو براتون بزارم:*
*قبل از صحبت راجع به ایندی باید مقدمه ای راجع به TCP/IP** بدانیم : سه عنصر اصلی در این باب وجود دارد :1-آی پی2-** Host Name**3-** Port Number**تصور نمایید که در شهری زندگی می کنید که دارای خیابانهاو ساختمانهای متعددی است تمامی ساختمانها دارای آدرس بوده و بعضا نام گذاری شده اند.*
*برای مثال ساختمان شکوفه در هر ساختمانی اتاقهای بسیاری هستند که به وسیله درب از یکدیگر جدا شده اند .*
*این مثالی از یک شهر است . بیایید ببینیم شما چگونه به ساختمانی در این شهر می روید؟* 
*شما تاکسی گرفته و از راننده تاکسی می خواهید شما را به آدرس ( خیابان 23وپلاک 157)ببرد .*
*اگر شما می خواهید به ساختمان مشهوری بروید کافی است نام آن را به راننده بگویید راننده شما را بدون آدرس دقیق به محل مورد نظر می برد زیرا او محل ساختمان را می داند.*

*بدین ترتیب شما به مقصد رسیده درب یکی از اتاقها را باز می نمایید.اگر بخواهید به اتاق دوستتان بروید کافی است درب اتاق او را باز نمایید همه چیز بسیار ساده است چون ما آن را یاد داریم.*
*حال به شما نشان خواهم داد که این روند در حقیقت همان* *tcp/ip**است .*
*در یک شبکه**TCP/IP** کامپیوترها به منزله ساختمانهای شهروخیابانها معادل اتصالات کامپیوتری یا همان**network connections** می باشند.* 
*هر کامپیوتر همانند ساختمانهای شهرمان دارای آدرسی است.* 
*بعضی کامپیوتر ها همانند ساختمانهای معروف اسم دارند.*
*هنگامی که شما در مرورگر خود آدرسی شبیه http://www.google.com** مینویسید مرورگر به سراغ کامپیوتر مورد نظر می رود (البته در حقیقت مرورگر آدرس را نمی داند شما در اینده یاد خواهید گرفت چگونه مرورگر قادر به یافتن آدرسها میباشد)*
*پورت هر کامپیوتری به منزله درب یک ساختمان است .در واقع هر پورت دروازه ای است به سمت خدمتی که این کامپیوتر به شما ارائه می نماید.*
*به عنوان مثال یک کامپیوتر می تواند خدماتی مانند صفحات وب را به شما تقدیم نماید.بعضی رایانه ها سرورهایی از نوع* *ftp**هستند.*
*شما میتوانید از این کامپیوترها فایلهایی را دانلود یا آپلود نمایید.*

*بطور عمومی اینها همه چیز راجع به* *tcp/ip**هیتند.شالوده* *intrnet**بر پایه همین قاعده یا پروتکل استوار است.*

*1-**IP Address**: یک شماره منحصر به فرد 4 بایتی که هر قسمت به وسیله نقطه از قسمت دیگه جدا می شوند .*
*به عنوان مثال**199.255.15.1* 
*2- پورت یک شماره صحیح است که به وسیله آن شما به خدماتی که توسط سیستمی که متصل به شبکه است دست یابید.معمولا شماره های پورت عددی کمتر از 1000 هستند. * 
*3-**Host Name**:نامی است که به عنوان آدرس کامپیوتر می باشد همانند :**www.google.com.*
*این نام نیز منحصر به فرد است .در اینجا مقدمه* *tcp/ip**تمام شدحال می خواهیم روی عملیات ساخت* *tcp/ip**با دلفی با استفاده از کامپوننت* *indy**.*
*اما ابتدا باید راجع به دو عبارت* *"blocking"**و* *"non-blocking"** سوکتها (**sockets**) چه مفهومی دارد ؟*
*دو مدل برنامه نویسی هستند که در TCP/IP** کاربرد دارند.*

*   NonBlockin**وسیله ایست که از مسدود شدن سوکت در دو حالت* *read,erite** جلوگیری می نماید.این عمل بسیار مفید است زیرا عملیات شما منتظر اتصال نمی ماند.* 
*متاسفانه استفاده از این تکنولوژی کمی پیچیده است.*
*هنگامی که عملیاتی از* *blocking socket** استفاده مینماید در واقع رویدادهای عملیات مسدود شده اند این چه معنی می دهد؟ در واقع شما مواجه خواهید شد با پنجره ای که پاسخی به دستورات شما نمی دهد.
ادامه دارد
*

----------


## aserfg

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

----------


## mrm0101

سلام . امیدوارم مطالبت منظم ادامه پیدا کند  نه اینکه بعد از دو سه روز خسته بشی و ولش کنی

----------


## hp1361

آره aserfg عزیز من هم مثل mrm0101 امیدوارم تا تهش بری.

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

یکی از قسمت های برنامه من همینه که بدلیل سختی زیاد و عدم آشنایی کامل فعلا غیر فعالش کردم

منتظرتم

----------


## aserfg

*ممکنه با خودتون بگین آخه چرا با ایندی باید ادامه بدم یا اینکه من دوست دارم ساده تر کارام انجام بشه و جواب شما اینجاست : بلی ایندی از قاعده* *blocked sockeds**استفاده می کنه اما به شکل متفاوتی . در پکیج ایندی کامپوننتی به نام* *anti-freeze**هست که از عمل* *stop respond** یا همون مشکلی که صحبتش رو کردیم جلوگیری می کنه نشانه های بسیار خوبی از کاربری* *indy**در این مقاله خواهید دید . اگه شما پکیج* *indy* *رو نصب کرده باشین می بینین که سه برگ نشان در دلفی ظاهر می شه:1-**clients**2-**servers**3-**misc** .*
*در برگه* *client** شما می توانید کلاینتی با انواع پروتکل ها ( قوانین ) اصلی بسازین:*
*(pop3, http, ftp etc.)**  اگه شما پیش زمینه راجع به این پروتکل ها ندارین توصیه می کنم مطالب قبلی رو با دقت بخونین . برگ نشان* *server**امکان ساخت سروری با استفاده از همه پروتکل ها رو فراهم می کنه .برگه* *misc** دارای کامپوننتهای متعددی است من اینجا روی این کامپوننتها زیاد تاکید نمی کنم .مهمترین کامپوننتی که اینجا معرفی می کنم عناصر* *TIdTcpClient**و**TIdTcpServer** هستن چرا که این دو کامپوننت در واقع هسته معماری* *indy* *می باشند. همه کامپوننتهای* *client**موروثی از* *TIdTcpClient** و همه کامپوننتهای* *server**موروثی از**TIdTcpServer** هستن.البته استثنا های بسیاری وجود داره که بعدا بحث می کنیم.یادگیری خوب این دو کامپوننت شما رو استاد* *tcp/ip**می کنه باور کنین !*

----------


## aserfg

*شاید شما فکر کنین که ما از سخت ترین جاشروع کرده ایم که البته درست است.ما از سخت ترین قسمت* *indy* *شروع کردیم ولی زمانی که کار ساخت کلاینت به اتمام برسه شما با تعجب خواهین گوفت چقدر این کار ساده بود .خوب پروژه جدیدی ایجاد نمایید و یک* *IdTcpServer**از برگه** Indy Server**که اولین کامپوننت این برگه هم هست رو روی فرم قرار داده خواص اونو همانند زیر تغییر دهید:*

*Active:true*
*defaultport:1111*

*greetingtext:welcome to my server*
*در واقع شماابتدا* *tcp server**رو تقریبا کامل کردین.*
*شما حتی یک خط کد هم وارد نکردین شگقت انگیزه نه!*
*بیایید اونو تست کنیم برای تست* *tcp server**ساده ترین راه استفاده از برنامه* *telnet**می باشد.*
*اگه* *telnet**براتون نا آشناست می تونین از* *help**ویندوز استفاده کنین .ضمنا مقاله ای تو همین سایت هست برا همین زیاد بهش نمی پردازم  اگه لازم بود بگین*
*https://barnamenevis.org/showth...ghlight=telnet*

*اینم آدرس این بحث تو سایت.*
*.استفاده از* *telnet**اتصالی رو با* *localhost** به وسیله پورت 1111برقرار می کنه.در زمان کوناهی شما پیام* *welcome to my server**می بینین .ما مثال سروز را توسعه خواهیم دادما اولین فرمانمان را اجرا خواهیم کردبیایید ببینیم که چطوری می شه این کار رو انجام دادابتدا می خوام طریقه کار سرور رو می خوام توضیح بدم می خوایم دستوری به شکل زیر بدیم**responde**که سرورمان پاسخ دهد* *ok I have responded** این اجرای اولین دستور ماست ابتدا* *CommandHandlersEnabled** را برابر* *true** و سپس روی* *CommandHandlers** دبل کلیک نماییداز پنجره باز شده دکمه**add new* *رو کلیک کرده حال در* *Object inspector** خواص رو مطابق زیر تغییر دهید :*
*Command:responde*
*Replynormal text:ok I heve responded* 
*به سادگی می شه تستش کرد که مطمئنا مشکلی ندارین بدون هیچ کد نویسی واقعا متشکریم* *indy**.*
*تو لینک همین سایت مطالب بسیار مفیدی راجع به* *indy**هست اما به نظر من از ابتدا تا آخر رو نرفتن من می خوام با همکاری شما این کار رو انجام بدیم با ارائه مثال های بسیار ساده.پس اگه بعضی مطالب توی سایت قبلا موجود باشه مدیران محترم باید ببخشن.*

----------


## aserfg

*دوستان عزیز قبل از ادامه لازمه شما چیزایی راجع به* *treading** بدونین اگه مقاله دوستمون (لینک پست قبلی) رو بخونین راجع به این موضوع کامل توضیح داده من تنها اشاره می کنم و سپس به صورت کامل تری دو کامپوننت اصلی رو بررسی می کنیم البته گام به گام و بدون هیچ تندروی فقط خواهش می کنم تا آخر همراهی کنید :سرور در حالت پیش فرض دارای دو* *tread* *آصلی است که اولی مدام در حال گوش دادن هست (**listeners treading* *)یعنی گوش به زنگه تا کانکشن جدیدی ایجاد بشه وبعد* *traed**دیگه ای ایجاد کرده و وظیفه جوابگویی تا پایان کار رو به این* *tread* *واگذار می کنه.*
*می خوام عمیق تر از مباحث گذشته کامپوننت* TIdTcpServer* روبررسی کنم پس به خاصیتهای این کامپ.ننت توجه نمایید:*
*Active**:زمانی که این خاصیت* *true* *است سرور کار خودشو شروع کرده و* *false**به معنای عکس این.*
  Command Handlers* : همون پیامهای متنی است که در مثال قبل مشاهده کردید.*
  CommandHandlersEnbaled* :وقتی این خاصیت* *true**باشه سرور می تونه به فرامین تعیین شده در خاصیت بالا جواب بده.*
  DefaultPort*: همون پورتیه که* *listeners treading** مدام اونو چک می کنه تا مبادا کانکشن دیگه ای ایجاد شده باشه !*
  Greeting* : می تونین پیغام خوشامدگویی رو اینجا تعریف کنید .*
  MaxConnections* :تعدا د کانکشنهایی رو تعیین می کنه که می تونند به صورت همزمان (اصطلاحا موازی) با سرور ایجاد بشن تگه این خاصیت صفر باشه سرور تعداد این کانکشن ها رو محدود نمی کنه و اگه هر مقدار دیگه ای باشه سرور سعی می کنه با حداکثر مقدار تعیین شده کار کنه.*
  MaxConnectionsReply* :این پیغام رمانی برای کلاینت ارسال می شه که تعداد کانکشنها بیشتر از مقدار اجازه داده باشه.* 
  ReplyUnnknownCommand*: این پیغام زمانی برای کلاینت ارسال می شه که دستور غیر موجودی رو ارسال کنه.*
  TerminateWaitTime*:تعداد میلی ثانیه هایی است که سرور صبر کند تا کار**tread**پایان یابد ( البته زمانی که می خواین کار سرور رو پایان بدید )ادامه دارد*

----------


## zman123456

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

----------


## aserfg

باشه من عذر خواهی می کنم یه ذره سرم شلوغ بود در اولین فرصت ادامه می دم .

----------


## سعید صابری

سلام 
شرمنده كه سوال بچگانه مي پرسم...خب ديگه بيسوادي و...
چطوري ميشه بوسيله IdTCPServer  يك دستور يا بافر و يا هر چيز ديگري را فرستاد بدون استفاده از رويدادها
مثل مي خوام روي button  كليك كنم يك ركورد را به كلاينت بفرستد
متشكرم

----------


## vcldeveloper

> چطوري ميشه بوسيله IdTCPServer  يك دستور يا بافر و يا هر چيز ديگري را فرستاد


منظور از "بدون استفاده از رویدادها" را متوجه نمیشم.
TIdTCPServer برای دریافت درخواست و پاسخ به آنها ایجاد شده، اگر قرار باشه که خودش درخواست هایی (یا دستورهایی) به یک سیستم دیگه بفرسته، دیگه اسمش Server نیست، بلکه خودش میشه Client برای یک سرور دیگه! در هر حال، اگر واقعا لازم هست که درخواستی از سرور به کلاینت ارسال بشه، می تونید از Thread مربوط به اون Connection در سمت سرور استفاده کنید: هر زمان که Clientایی به سرور وصل میشه، رویداد OnConnect در سمت سرور فراخوانی میشه و یک پارامتر از نوع TIdPeerThread دریافت میکنه که Thread مربوط به اون Connection هست. می تونید اشاره گری به این Thread را جایی (مثلا در یک لیست) نگهداری کنید و هر زمان که خواستید داده ایی از سرور به کلاینت بفرستید، از خصوصیت Connection این Thread استفاده کنید. Connection متدهای SendCmd، Write، WriteBuffer و... داره. این متدها در راهنمای Indy توضیح داده شدند.

----------


## سعید صابری

متشكرم از راهنماييتون
من مي خوام بوسيله سرور كامپيوتر كلاينت را كنترل كنم مثلا وقتي كلمه shutdown  را مي فرستم بوسيله پروسيجري كه در برنامه كلاينت تعريف كرده ام كامپيوتر را خوموش كنه نمي دونم منظورم حالا متوجه شده باشين يا نه؟ 
من دقيقا همون چيزي كه شما فرموديد مي خوام اگه يه مثال برام بزنيد ممنون ميشم
از كمكتون بسيار متشكر و ممنونم اميدوارم هميشه موفق باشيد

----------


## vcldeveloper

> من مي خوام بوسيله سرور كامپيوتر كلاينت را كنترل كنم مثلا وقتي كلمه shutdown را مي فرستم بوسيله پروسيجري كه در برنامه كلاينت تعريف كرده ام كامپيوتر را خوموش كنه نمي دونم منظورم حالا متوجه شده باشين يا نه؟


سرور اون سیستمی هست که درخواست ها را دریافت میکنه. در مثال شما، سیستمی که دستور Shutdown را ارسال میکنه کلاینت هست، سیستمی هم که دستور را اجرا میکنه سرور هست. در هر حال، اون توابع که کارشون مشخصه:
AThread.Connection.SendCmd('My_Command');

----------


## babak_delphi

آیا در سمت کلاینت به غیر از استفاده از تایمر ، روش دیگری هم هست؟
من از کامپوننتی که برای جلوگیری از فریز شدن داره (اسمش یادم نیست) هم استفاده کردم ولی باز هم مشکل داشت

----------


## سعید صابری

با عرض پوزش مجدد
من طبق گفته شما يه متغير از نوع TIdPeerThread تعريف كردم اگه ميشه بفرماييد فقط تعداد كامپيوترها زياد باشد چطوري به كامپيوتر خاص ميشه دستور فرستاد بيسوادي ما را به بزرگواري خودتون ببخشيد

----------


## vcldeveloper

> من طبق گفته شما يه متغير از نوع 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.

----------


## aserfg

با سلام خدمت همه عزيزان و باتشكر از استاد گرانقدر جناب كشاورز. لازمه بهتون بگم علت اينكه فاصله زيادي بين ارسال مطالب وجود داره به خاطر اين بود كه مي ديدم ترجمه مابقي مقاله دقيقا تو همين سايت بارها صحبت شده ولي با توجه به اينكه من مي خوام مطالب انسجام بيشتر داشته باشه و اين تاپيك رو به سرانجام برسونم و مطالب بيشتري در آينده براتون بزارم بنابراين چاره اي نيست جز تكرار مطالبي كه دوستان قبلا بيان كردن . ولي ادامه به شكل ديگه اي خواهد بود پس انشاا.. تا آخر با ما باشين . 
  خاصيتهايي كه تو آخرين پست گفتم بسيار داراي اهميتن و شما بي شك زماني كه برنامه سرور رو بسازيم با اونا كار مي كنين. همونطور كه شما خواهين ديد با سرور مي شه به دوگونه كار كرد يكي استفاده از command handlers.بزارين يه مثال روبررسي كنيم.دستور add رو مي خوايم با اين روش اجرا كنيم يعني زماني كه يه كلاينت دستوري به شكل زير مي فرسته *add no1 no2 ... noN* 

 سرور پاسخي همانند زير رو ارسال مي كنه:
*no1+no2+...+noN (**جمع اعداد)* 
خوب سرور رو ست مي كنيم . ابتدا يه tidtcpserverرو روي فرم بزارين خاصيت اكتيو رو trueو
Default port=1111; CommandHandlesEnabled=true;    حالا اديتور مربوط به CommandHandlersرو باز كرده و دو آيتم ايجاد نماييد.براي ايتم اولي command=hello, ReplyNormal Text =hiاولين دستور كامل شدسپس ايتم دوم رو برابر زير ست نماييد.
Command=add;      خوب حالا زمان اونرسيده كه كمي كدنويسي كنيم از    ObjectInspector بر روي رويداد OnCommand item  دبل كليك كنين و سپس كدهاي زير رو بنويسين.

procedure TForm1.IdTCPServer1CommandHandlers1Command(ASender  : TIdCommand); 
*var* 
i:integer; 
f:float; 
*begin* 
f:=0; 
*for* i:=0 *to* ASender.Params.Count-1 *do* 
      f:=f+strtofloat(ASender.Params[i]); 
ASender.Thread.Connection.Writeln(floattostr(f)); 
*end*;    تو تاپيك آينده كمي راجع به پارامتر *asender*با هاتون صحبت مي كنم.

----------


## سعید صابری

از اساتيد محترم يه سوال داشتم 
چطوري ميشه چند تا كامپيوتر با هم ارتباط داشته باشن بدون اينكه هيچ كدوم سرور باشند همه در يك سطح باشن اصلاً امكانپذير هستن

----------


## vcldeveloper

> چطوري ميشه چند تا كامپيوتر با هم ارتباط داشته باشن بدون اينكه هيچ كدوم سرور باشند همه در يك سطح باشن اصلاً امكانپذير هستن


بله، بهش میگن اتصال Peer-to-peer.
با همین کامپوننت های IdTCPServer و IdTCPClient در Indy می تونید پیاده سازیش کنید.

----------


## سعید صابری

اگه بيشتر توضيح بدين ممنون ميشم
اگه با ذكر مثال باشه كه ديگه واقعا سنگ تموم گذاشتين

----------


## aserfg

به كدهاي نوشته شده نگاه كنيد اينجاما يك عبارت ناشناس به نامAsende rداريم و خواصي مانند Params وConnectionرو براي اين پارامتر استفاده كرديم و درآخر با استفاده از متد Writeln يه عبارت رو بر روي كلاينت فرستاديم .به نظر مي اد آسون باشه در واقع *Asender* همون كلاينتيه كه به سرور متصله. بحثمون راجع به تريدها ي ايندي بياد آوريد براي هر كلاينتي كه به سرور وصل مي شه يه تريد جديد به وجود مي آد.در واقع خاصيت Asender(تريد ) درواقع بيانگر همون كلاينته و خودش داراي تعداد زيادي خاصيته ولي   مهمترين اونا خاصيت كانكشنه به وسيله اين خاصيت مي تونيم يه مقدار رشته اي يا عددي يا يك ركورد رو ارسال كنيم.حالامي خوايم كليه متدها و خواصي رو كه در ارتباط با كلاينت موجود هست رو بررسي كنيم.



  و WriteInteger(AValue:integer; AConvert:boolean)و ReadBuffer(ABuffer;AByteCount:longint)و WriteBuffer(ABuffer;AByteCount:longint; AWriteNow:boolean)
  ReadStream (AStream:TStream;AByteCount:longint;AReadUntilDisc  onnect:boolean)
  WriteStream (AStream:TStream;AAll:boolean;AWriteByteCount:bool  ean)   Write:براي نوشتن يه مقدار رشته اي همانن نوشتن تو فايل   Read : براي خواندن يه رشته   Writeln:نوشتن يه رشته با رفتن به ابتداي سطرو بقيه متدها: ReadCardinal(AConvert:boolean)و WriteCardinal(AValue:Cardinal;AConvert:boolean)و ReadInteger(AConvert:boolean)

اينها مهمترين متدهاي خاصيت Connection هستندشما بارها از اين متدها زماني كه برنامه كلاين و سرور خودتون رو بسازين استفاده خواهين كرد.وقتي من براي اولين بار به معماري indy  دقت كردم ياد سيستم عامل داس و اولين برنامه هايي كه با زبان Turbo Pascal نوشم افتادم.اين برنامه رو ببينين:
*program*   Sum;
*var* a, b: real;
*begin* 
Write('A='); 
ReadLn(A); 
Write('B='); 
Readln(B); 
a:=a+b; 
Write ('The Sum is:'); 
Writeln(a); 
*end.* 
 اين بسيار شبيه كار indy است.شما مي تونين با ساخت هر tcp/ip ظرافت كار ايندي رو ببينين.ما كمي راجع به كامپوننت TidTcpClient صحبت مي كنيم و سپس سراغ برنامه هي كاربردي خواهيم رفت.ساخت يه كلاينت بسيار آسونه كافيه شما يه كامپوننت TidTcpClient  روي فرم زارين و حالا شما 80درصد كار رو انجام دادين و تنها 20 درصد باقيمانده رو من اينجا بهتون ياد ميدم. سروري كه باهم ساختيم كه يادتونه دو فرمان hello,add رو داشت حالا براي اون سرور يه كلاينت مي سازيم.دو عدد دكمه روي فرم گذاشتهو يك TidTcpClient همچنين يه tlistbox توي اين ليست باكس ما مقاديري رو نگهداري خواهيم كرد كه مي خوايم به سرور ارسال كنيم.(براي فرمان add).شما مجبورين پورت و hostرو براي اين كلاينت ست كنين پورت كه همون پورت سرور (1111 ) است. اگه سرور و كلاينت شما روي يه سيستمه خاصيت host رو برابر 127.0.0.1 ست كنين (كه در واقع آدرس local hostاست.) در غير اين صورت اونو برابر ip addressو يا host name   سرورتون قرار بدين.ابتدا فرمان helloرو اجرا مي كنيم.
*procedure* TForm1.Button1Click(Sender:TObject); 
*begin* 
*with* IdTcpClient1 *do* 
   *begin* 
   connect; 
   Writeln('Hello'); 
   ShowMessage(Readln); 
   Disconnect; 
   *end*; 
*end* حالا هر دو برنامه كلاينت و سرور رو با هم اجرا كنيد اگه همه چيز درست باشه شما پيام سرور رو دريافت مي كنين. حالا فرمان دوم رو اجرا مي كنيم .
 

*procedure* TForm1.Button2Click(Sender:TObject); 
*var* 
command: string; 
i:integer; 
*begin* 
command:='Add'; 
*for* i:=0 *to* ListBox1.Items.Count -1 *do* 
   command:=command+' '+ListBox1.Items[i]; 

*with* IdTcpClient1 *do* 
   *begin* 
   connect; 
   Writeln(command); 
   ShowMessage(Readln); 
   Disconnect; 
   *end*; 
*end*;

----------


## aserfg

چند نكته كه شايد _هنوز_  هم براي بعضيا جاي سئوال باشه و نظر به اهميت موضوع با توجه به اينكه اساس كار شبكه با مفاهيمي چون پورت، آي پي آدرس و سوكت گره خورده يه توضيح جالب رو ببينين : در پروتوكل tcp پورت سرور از 1024كمتر و در پروتوكل ftp ، بيست ويا بيست ويك معمولا ست مي كنند . بايد بدونين كه پورت مربوط به برنامه اي هست كه باهاش كار مي كنين {مشخصه اي براي يك برنامه و در يك كامپيوتر خاص است} و ip address مربوط به كامپيوتر است .   
پورت عددي بين 65535و 0 است .
سوكت: يك برنامه سوكتي را با مشخص نمودن ip addressمربوط به يك كامپيوتر و نوع سرويس (tcp-udp) و پورتي كه نشان دهنده *برنامه* است را مشخص مي نمايد. ip address موجود در سوكت براي آدرس دهي كامپيوتر مقصد و پورت مربوط به برنامه اي را كه داده ها براي آن ارسال مي گردد را مشخص مي كند.

----------


## aserfg

يكي از دموهاي ايندي كه توسط گروه ايندي نوشته شده و مخصوص ارسال ميله رو براتون مي زارم اگه برا ي ست كردنش مشكل داشتين بگين تا اونا رو هم توضيح بدم.

----------

