نمایش نتایج 1 تا 23 از 23

نام تاپیک: indy

  1. #1
    کاربر دائمی آواتار aserfg
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    Asp+.net
    پست
    617

    indy

    با توجه به اینکه مطالبی که راجع به indyدر سایت وجود داره مخصوصا مطالب آقای گلادیاتور ولی باز هم به دلیل جذابیت خواستم مطالب بیشتری رو براتون بزارم:
    قبل از صحبت راجع به ایندی باید مقدمه ای راجع به TCP/IP بدانیم : سه عنصر اصلی در این باب وجود دارد :1-آی پی2- Host Name3- 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 استفاده مینماید در واقع رویدادهای عملیات مسدود شده اند این چه معنی می دهد؟ در واقع شما مواجه خواهید شد با پنجره ای که پاسخی به دستورات شما نمی دهد.
    ادامه دارد

  2. #2
    کاربر دائمی آواتار aserfg
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    Asp+.net
    پست
    617
    دوستان باید ببخشید چون مطالب ترجمه مقاله است کمی از لحاظ جمله بندی مشکل داره
    عذر خواهم

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

  4. #4
    کاربر دائمی آواتار hp1361
    تاریخ عضویت
    دی 1384
    محل زندگی
    تهران
    پست
    750
    آره aserfg عزیز من هم مثل mrm0101 امیدوارم تا تهش بری.

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

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

    منتظرتم

  5. #5
    کاربر دائمی آواتار aserfg
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    Asp+.net
    پست
    617
    ممکنه با خودتون بگین آخه چرا با ایندی باید ادامه بدم یا اینکه من دوست دارم ساده تر کارام انجام بشه و جواب شما اینجاست : بلی ایندی از قاعده 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می کنه باور کنین !

  6. #6
    کاربر دائمی آواتار aserfg
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    Asp+.net
    پست
    617
    شاید شما فکر کنین که ما از سخت ترین جاشروع کرده ایم که البته درست است.ما از سخت ترین قسمت 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هست اما به نظر من از ابتدا تا آخر رو نرفتن من می خوام با همکاری شما این کار رو انجام بدیم با ارائه مثال های بسیار ساده.پس اگه بعضی مطالب توی سایت قبلا موجود باشه مدیران محترم باید ببخشن.

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

  8. #8
    کاربر دائمی آواتار zman123456
    تاریخ عضویت
    شهریور 1385
    محل زندگی
    بندرعباس
    پست
    515
    آقا دستت درد نکنه ولی خداییش قطع نشه.اگه کمکی میشه کرد بفرما تا انجام بدیم.

  9. #9
    کاربر دائمی آواتار aserfg
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    Asp+.net
    پست
    617
    باشه من عذر خواهی می کنم یه ذره سرم شلوغ بود در اولین فرصت ادامه می دم .

  10. #10
    کاربر دائمی آواتار سعید صابری
    تاریخ عضویت
    اردیبهشت 1387
    محل زندگی
    برازجان
    پست
    1,431

    نقل قول: indy

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

  11. #11

    نقل قول: indy

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


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  12. #12
    کاربر دائمی آواتار سعید صابری
    تاریخ عضویت
    اردیبهشت 1387
    محل زندگی
    برازجان
    پست
    1,431

    نقل قول: indy

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

  13. #13

    نقل قول: indy

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


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  14. #14
    کاربر دائمی آواتار babak_delphi
    تاریخ عضویت
    اردیبهشت 1384
    محل زندگی
    آستارا
    پست
    634

    نقل قول: indy

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

  15. #15
    کاربر دائمی آواتار سعید صابری
    تاریخ عضویت
    اردیبهشت 1387
    محل زندگی
    برازجان
    پست
    1,431

    نقل قول: indy

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

  16. #16

    نقل قول: indy

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


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  17. #17
    کاربر دائمی آواتار aserfg
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    Asp+.net
    پست
    617

    نقل قول: indy

    با سلام خدمت همه عزيزان و باتشكر از استاد گرانقدر جناب كشاورز. لازمه بهتون بگم علت اينكه فاصله زيادي بين ارسال مطالب وجود داره به خاطر اين بود كه مي ديدم ترجمه مابقي مقاله دقيقا تو همين سايت بارها صحبت شده ولي با توجه به اينكه من مي خوام مطالب انسجام بيشتر داشته باشه و اين تاپيك رو به سرانجام برسونم و مطالب بيشتري در آينده براتون بزارم بنابراين چاره اي نيست جز تكرار مطالبي كه دوستان قبلا بيان كردن . ولي ادامه به شكل ديگه اي خواهد بود پس انشاا.. تا آخر با ما باشين .
    خاصيتهايي كه تو آخرين پست گفتم بسيار داراي اهميتن و شما بي شك زماني كه برنامه سرور رو بسازيم با اونا كار مي كنين. همونطور كه شما خواهين ديد با سرور مي شه به دوگونه كار كرد يكي استفاده از 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با هاتون صحبت مي كنم.

  18. #18
    کاربر دائمی آواتار سعید صابری
    تاریخ عضویت
    اردیبهشت 1387
    محل زندگی
    برازجان
    پست
    1,431

    نقل قول: indy

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

  19. #19

    نقل قول: indy

    چطوري ميشه چند تا كامپيوتر با هم ارتباط داشته باشن بدون اينكه هيچ كدوم سرور باشند همه در يك سطح باشن اصلاً امكانپذير هستن
    بله، بهش میگن اتصال Peer-to-peer.
    با همین کامپوننت های IdTCPServer و IdTCPClient در Indy می تونید پیاده سازیش کنید.


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  20. #20
    کاربر دائمی آواتار سعید صابری
    تاریخ عضویت
    اردیبهشت 1387
    محل زندگی
    برازجان
    پست
    1,431

    نقل قول: indy

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

  21. #21
    کاربر دائمی آواتار aserfg
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    Asp+.net
    پست
    617

    نقل قول: indy

    به كدهاي نوشته شده نگاه كنيد اينجاما يك عبارت ناشناس به نام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;

  22. #22
    کاربر دائمی آواتار aserfg
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    Asp+.net
    پست
    617

    پاورقي

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

  23. #23
    کاربر دائمی آواتار aserfg
    تاریخ عضویت
    شهریور 1386
    محل زندگی
    Asp+.net
    پست
    617

    نقل قول: indy

    يكي از دموهاي ايندي كه توسط گروه ايندي نوشته شده و مخصوص ارسال ميله رو براتون مي زارم اگه برا ي ست كردنش مشكل داشتين بگين تا اونا رو هم توضيح بدم.
    فایل های ضمیمه فایل های ضمیمه
    آخرین ویرایش به وسیله aserfg : جمعه 17 خرداد 1387 در 20:09 عصر

تاپیک های مشابه

  1. برنامه نویسی شبکه ( راهنمای گام به گام Indy ) - بخش اول
    نوشته شده توسط www2006 در بخش مقالات مرتبط با Delphi/Win32
    پاسخ: 41
    آخرین پست: پنج شنبه 21 مرداد 1389, 02:09 صبح
  2. مشکل در indy
    نوشته شده توسط neda azadi در بخش برنامه نویسی در Delphi
    پاسخ: 2
    آخرین پست: شنبه 04 فروردین 1386, 13:41 عصر
  3. از اساتید محترم خواهشمندم کمک نمائید - Indy و طراحی مسنجر
    نوشته شده توسط saniak_robot در بخش برنامه نویسی در Delphi
    پاسخ: 12
    آخرین پست: پنج شنبه 09 شهریور 1385, 13:38 عصر
  4. هندل کردن خطا در کار کردن با Indy
    نوشته شده توسط TrueFalse در بخش برنامه نویسی در Delphi
    پاسخ: 8
    آخرین پست: شنبه 20 خرداد 1385, 01:35 صبح
  5. خطا در استفاده از Indy
    نوشته شده توسط MNosouhi در بخش برنامه نویسی در Delphi
    پاسخ: 0
    آخرین پست: سه شنبه 29 فروردین 1385, 11:52 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •