PDA

View Full Version : indy



aserfg
پنج شنبه 29 آذر 1386, 17:02 عصر
با توجه به اینکه مطالبی که راجع به indyدر سایت وجود داره مخصوصا مطالب آقای گلادیاتور ولی باز هم به دلیل جذابیت خواستم مطالب بیشتری رو براتون بزارم:
قبل از صحبت راجع به ایندی باید مقدمه ای راجع به TCP/IP (http://amazon.de/gp/product/0596009860?ie=UTF8&tag=delphi300comc-21&link_code=em1&camp=2510&creative=11150&creativeASIN=0596009860&adid=244757b9-8345-4fef-a43d-4ce5bcf6e1c1) بدانیم : سه عنصر اصلی در این باب وجود دارد :1-آی پی2- Host Name3- Port Numberتصور نمایید که در شهری زندگی می کنید که دارای خیابانهاو ساختمانهای متعددی است تمامی ساختمانها دارای آدرس بوده و بعضا نام گذاری شده اند.
برای مثال ساختمان شکوفه در هر ساختمانی اتاقهای بسیاری هستند که به وسیله درب از یکدیگر جدا شده اند .
این مثالی از یک شهر است . بیایید ببینیم شما چگونه به ساختمانی در این شهر می روید؟
شما تاکسی گرفته و از راننده تاکسی می خواهید شما را به آدرس ( خیابان 23وپلاک 157)ببرد .
اگر شما می خواهید به ساختمان مشهوری بروید کافی است نام آن را به راننده بگویید راننده شما را بدون آدرس دقیق به محل مورد نظر می برد زیرا او محل ساختمان را می داند.

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

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

1-IP Address: یک شماره منحصر به فرد 4 بایتی که هر قسمت به وسیله نقطه از قسمت دیگه جدا می شوند .
به عنوان مثال199.255.15.1
2- پورت یک شماره صحیح است که به وسیله آن شما به خدماتی که توسط سیستمی که متصل به شبکه است دست یابید.معمولا شماره های پورت عددی کمتر از 1000 هستند.
3-Host Name:نامی است که به عنوان آدرس کامپیوتر می باشد همانند :www.google.com (http://www.google.com/).
این نام نیز منحصر به فرد است .در اینجا مقدمه tcp/ipتمام شدحال می خواهیم روی عملیات ساخت tcp/ipبا دلفی با استفاده از کامپوننت indy.
اما ابتدا باید راجع به دو عبارت "blocking"و "non-blocking" سوکتها (sockets) چه مفهومی دارد ؟
دو مدل برنامه نویسی هستند که در TCP/IP (http://amazon.de/gp/product/0596009860?ie=UTF8&tag=delphi300comc-21&link_code=em1&camp=2510&creative=11150&creativeASIN=0596009860&adid=d7b82ac8-7b55-43f2-8b56-b2acf6812382) کاربرد دارند.

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

aserfg
پنج شنبه 29 آذر 1386, 17:16 عصر
دوستان باید ببخشید چون مطالب ترجمه مقاله است کمی از لحاظ جمله بندی مشکل داره
عذر خواهم

mrm0101
پنج شنبه 29 آذر 1386, 18:10 عصر
سلام . امیدوارم مطالبت منظم ادامه پیدا کند نه اینکه بعد از دو سه روز خسته بشی و ولش کنی

hp1361
پنج شنبه 29 آذر 1386, 19:45 عصر
آره aserfg عزیز من هم مثل mrm0101 امیدوارم تا تهش بری.

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

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

منتظرتم

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

aserfg
پنج شنبه 29 آذر 1386, 23:15 عصر
شاید شما فکر کنین که ما از سخت ترین جاشروع کرده ایم که البته درست است.ما از سخت ترین قسمت indy شروع کردیم ولی زمانی که کار ساخت کلاینت به اتمام برسه شما با تعجب خواهین گوفت چقدر این کار ساده بود .خوب پروژه جدیدی ایجاد نمایید و یک IdTcpServerاز برگه Indy Serverکه اولین کامپوننت این برگه هم هست رو روی فرم قرار داده خواص اونو همانند زیر تغییر دهید:

Active:true
defaultport:1111

greetingtext:welcome to my server
در واقع شماابتدا tcp serverرو تقریبا کامل کردین.
شما حتی یک خط کد هم وارد نکردین شگقت انگیزه نه!
بیایید اونو تست کنیم برای تست tcp serverساده ترین راه استفاده از برنامه telnetمی باشد.
اگه telnetبراتون نا آشناست می تونین از helpویندوز استفاده کنین .ضمنا مقاله ای تو همین سایت هست برا همین زیاد بهش نمی پردازم اگه لازم بود بگین
http://barnamenevis.org/forum/showthread.php?t=52037&highlight=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
جمعه 30 آذر 1386, 11:23 صبح
دوستان عزیز قبل از ادامه لازمه شما چیزایی راجع به treading بدونین اگه مقاله دوستمون (لینک پست قبلی) رو بخونین راجع به این موضوع کامل توضیح داده من تنها اشاره می کنم و سپس به صورت کامل تری دو کامپوننت اصلی رو بررسی می کنیم البته گام به گام و بدون هیچ تندروی فقط خواهش می کنم تا آخر همراهی کنید :سرور در حالت پیش فرض دارای دو tread آصلی است که اولی مدام در حال گوش دادن هست (listeners treading )یعنی گوش به زنگه تا کانکشن جدیدی ایجاد بشه وبعد traedدیگه ای ایجاد کرده و وظیفه جوابگویی تا پایان کار رو به این tread واگذار می کنه.
می خوام عمیق تر از مباحث گذشته کامپوننت TIdTcpServer روبررسی کنم پس به خاصیتهای این کامپ.ننت توجه نمایید:
Active:زمانی که این خاصیت true است سرور کار خودشو شروع کرده و falseبه معنای عکس این.
Command Handlers : همون پیامهای متنی است که در مثال قبل مشاهده کردید.
CommandHandlersEnbaled :وقتی این خاصیت trueباشه سرور می تونه به فرامین تعیین شده در خاصیت بالا جواب بده.
DefaultPort: همون پورتیه که listeners treading مدام اونو چک می کنه تا مبادا کانکشن دیگه ای ایجاد شده باشه !
Greeting : می تونین پیغام خوشامدگویی رو اینجا تعریف کنید .
MaxConnections :تعدا د کانکشنهایی رو تعیین می کنه که می تونند به صورت همزمان (اصطلاحا موازی) با سرور ایجاد بشن تگه این خاصیت صفر باشه سرور تعداد این کانکشن ها رو محدود نمی کنه و اگه هر مقدار دیگه ای باشه سرور سعی می کنه با حداکثر مقدار تعیین شده کار کنه.
MaxConnectionsReply :این پیغام رمانی برای کلاینت ارسال می شه که تعداد کانکشنها بیشتر از مقدار اجازه داده باشه.
ReplyUnnknownCommand: این پیغام زمانی برای کلاینت ارسال می شه که دستور غیر موجودی رو ارسال کنه.
TerminateWaitTime:تعداد میلی ثانیه هایی است که سرور صبر کند تا کارtreadپایان یابد ( البته زمانی که می خواین کار سرور رو پایان بدید )ادامه دارد

zman123456
یک شنبه 14 بهمن 1386, 19:50 عصر
آقا دستت درد نکنه ولی خداییش قطع نشه.اگه کمکی میشه کرد بفرما تا انجام بدیم.

aserfg
یک شنبه 14 بهمن 1386, 20:50 عصر
باشه من عذر خواهی می کنم یه ذره سرم شلوغ بود در اولین فرصت ادامه می دم .

سعید صابری
دوشنبه 06 خرداد 1387, 17:22 عصر
سلام
شرمنده كه سوال بچگانه مي پرسم...خب ديگه بيسوادي و...
چطوري ميشه بوسيله IdTCPServer يك دستور يا بافر و يا هر چيز ديگري را فرستاد بدون استفاده از رويدادها
مثل مي خوام روي button كليك كنم يك ركورد را به كلاينت بفرستد
متشكرم

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

سعید صابری
سه شنبه 07 خرداد 1387, 12:02 عصر
متشكرم از راهنماييتون
من مي خوام بوسيله سرور كامپيوتر كلاينت را كنترل كنم مثلا وقتي كلمه shutdown را مي فرستم بوسيله پروسيجري كه در برنامه كلاينت تعريف كرده ام كامپيوتر را خوموش كنه نمي دونم منظورم حالا متوجه شده باشين يا نه؟
من دقيقا همون چيزي كه شما فرموديد مي خوام اگه يه مثال برام بزنيد ممنون ميشم
از كمكتون بسيار متشكر و ممنونم اميدوارم هميشه موفق باشيد

vcldeveloper
سه شنبه 07 خرداد 1387, 20:21 عصر
من مي خوام بوسيله سرور كامپيوتر كلاينت را كنترل كنم مثلا وقتي كلمه shutdown را مي فرستم بوسيله پروسيجري كه در برنامه كلاينت تعريف كرده ام كامپيوتر را خوموش كنه نمي دونم منظورم حالا متوجه شده باشين يا نه؟
سرور اون سیستمی هست که درخواست ها را دریافت میکنه. در مثال شما، سیستمی که دستور Shutdown را ارسال میکنه کلاینت هست، سیستمی هم که دستور را اجرا میکنه سرور هست. در هر حال، اون توابع که کارشون مشخصه:

AThread.Connection.SendCmd('My_Command');

babak_delphi
چهارشنبه 08 خرداد 1387, 00:07 صبح
آیا در سمت کلاینت به غیر از استفاده از تایمر ، روش دیگری هم هست؟
من از کامپوننتی که برای جلوگیری از فریز شدن داره (اسمش یادم نیست) هم استفاده کردم ولی باز هم مشکل داشت

سعید صابری
چهارشنبه 08 خرداد 1387, 17:01 عصر
با عرض پوزش مجدد
من طبق گفته شما يه متغير از نوع TIdPeerThread تعريف كردم اگه ميشه بفرماييد فقط تعداد كامپيوترها زياد باشد چطوري به كامپيوتر خاص ميشه دستور فرستاد بيسوادي ما را به بزرگواري خودتون ببخشيد

vcldeveloper
چهارشنبه 08 خرداد 1387, 19:33 عصر
من طبق گفته شما يه متغير از نوع 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
چهارشنبه 08 خرداد 1387, 21:48 عصر
با سلام خدمت همه عزيزان و باتشكر از استاد گرانقدر جناب كشاورز. لازمه بهتون بگم علت اينكه فاصله زيادي بين ارسال مطالب وجود داره به خاطر اين بود كه مي ديدم ترجمه مابقي مقاله دقيقا تو همين سايت بارها صحبت شده ولي با توجه به اينكه من مي خوام مطالب انسجام بيشتر داشته باشه و اين تاپيك رو به سرانجام برسونم و مطالب بيشتري در آينده براتون بزارم بنابراين چاره اي نيست جز تكرار مطالبي كه دوستان قبلا بيان كردن . ولي ادامه به شكل ديگه اي خواهد بود پس انشاا.. تا آخر با ما باشين .
خاصيتهايي كه تو آخرين پست گفتم بسيار داراي اهميتن و شما بي شك زماني كه برنامه سرور رو بسازيم با اونا كار مي كنين. همونطور كه شما خواهين ديد با سرور مي شه به دوگونه كار كرد يكي استفاده از 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با هاتون صحبت مي كنم.

سعید صابری
شنبه 11 خرداد 1387, 11:57 صبح
از اساتيد محترم يه سوال داشتم
چطوري ميشه چند تا كامپيوتر با هم ارتباط داشته باشن بدون اينكه هيچ كدوم سرور باشند همه در يك سطح باشن اصلاً امكانپذير هستن

vcldeveloper
شنبه 11 خرداد 1387, 17:29 عصر
چطوري ميشه چند تا كامپيوتر با هم ارتباط داشته باشن بدون اينكه هيچ كدوم سرور باشند همه در يك سطح باشن اصلاً امكانپذير هستن
بله، بهش میگن اتصال Peer-to-peer.
با همین کامپوننت های IdTCPServer و IdTCPClient در Indy می تونید پیاده سازیش کنید.

سعید صابری
شنبه 11 خرداد 1387, 17:45 عصر
اگه بيشتر توضيح بدين ممنون ميشم
اگه با ذكر مثال باشه كه ديگه واقعا سنگ تموم گذاشتين

aserfg
شنبه 11 خرداد 1387, 19:53 عصر
به كدهاي نوشته شده نگاه كنيد اينجاما يك عبارت ناشناس به نام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
شنبه 11 خرداد 1387, 20:26 عصر
چند نكته كه شايد هنوز هم براي بعضيا جاي سئوال باشه و نظر به اهميت موضوع با توجه به اينكه اساس كار شبكه با مفاهيمي چون پورت، آي پي آدرس و سوكت گره خورده يه توضيح جالب رو ببينين : در پروتوكل tcp پورت سرور از 1024كمتر و در پروتوكل ftp ، بيست ويا بيست ويك معمولا ست مي كنند . بايد بدونين كه پورت مربوط به برنامه اي هست كه باهاش كار مي كنين {مشخصه اي براي يك برنامه و در يك كامپيوتر خاص است} و ip address مربوط به كامپيوتر است .
پورت عددي بين 65535و 0 است .
سوكت: يك برنامه سوكتي را با مشخص نمودن ip addressمربوط به يك كامپيوتر و نوع سرويس (tcp-udp) و پورتي كه نشان دهنده برنامه است را مشخص مي نمايد. ip address موجود در سوكت براي آدرس دهي كامپيوتر مقصد و پورت مربوط به برنامه اي را كه داده ها براي آن ارسال مي گردد را مشخص مي كند.

aserfg
جمعه 17 خرداد 1387, 19:42 عصر
يكي از دموهاي ايندي كه توسط گروه ايندي نوشته شده و مخصوص ارسال ميله رو براتون مي زارم اگه برا ي ست كردنش مشكل داشتين بگين تا اونا رو هم توضيح بدم.