دلفی و شبکه - Indy

شروع موضوع توسط saalek110 ‏3 سپتامبر 2005 در انجمن منطق و الگوریتم برنامه‌نویسی

  1. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    113
    دلفی و شبکه - Indy
     
    نوشته شده توسط saalek110 در ‏3 سپتامبر 2005
  2. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    113
    فهرست:
     
    نوشته شده توسط saalek110 در ‏12 مارس 2008
    mno از این پست تشکر کرده است.
  3. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    113
    دریافت عکس از شبکه و نمایش آن

    اینها را uses کنید:
    کد (Text):
     Jpeg, IdBaseComponent, IdComponent,IdTCPConnection, IdTCPClient, IdHTTP;
    تابع:
    کد (Text):
       function DownloadJPGToBitmap(const URL : string; ABitmap: TBitmap): Boolean;
    var
      idHttp: TIdHTTP;
      ImgStream: TMemoryStream;
      JpgImage: TJPEGImage;
    begin
      Result := False;
      ImgStream := TMemoryStream.Create;
      try
        idHttp := TIdHTTP.Create(nil);
        try
          idHttp.Get(URL, ImgStream);
        finally
          idHttp.Free;
        end;
        ImgStream.Position := 0;
        JpgImage := TJPEGImage.Create;
        try
          JpgImage.LoadFromStream(ImgStream);
          ABitmap.Assign(JpgImage);
        finally
          Result := True;
          JpgImage.Free;
        end;
      finally
        ImgStream.Free;
      end;
    end;
    رویداد باتون:
    کد (Text):
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        DownloadJPGToBitmap('http://irdelphi.250free.com/g/g2/a2/nature.jpg', Image1.Picture.Bitmap);
    end;
    [​IMG]

    اشیای روی فرم : یک باتون و یک ایمیج
     
    نوشته شده توسط saalek110 در ‏12 مارس 2008
    mno و farhad110 از این پست تشکر کرده اند.
  4. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    113
    ارتباط با php

    از تب Indy Clients یک IdHTTP به فرم بیافزایید.
    یک ممو و باتون هم بیافزایید.

    در رویداد باتون کد زیر را قرار دهید:
    کد (Text):
    procedure TForm1.Button1Click(Sender: TObject);
    var
      SL: TStringList;
      i: integer;
    begin
      SL := TSTringList.Create;
      try
        SL.Values['name'] := 'amir';
        SL.Values['age'] := '19';
        SL.text := idHttp1.Post('http://saalek.awardspace.com/delphi/post1.php', SL);
         memo1.Text:=SL.text;
      finally
        SL.Free;
      end;
    end;
    در سایت:
    http://saalek.awardspace.com/delphi/form/post1.php
    هم من کد زیر را قرار داده ام:
    کد (Text):
    <?php
    echo "Welcome ";  
    echo $_POST["name"];
    echo "\n";
    echo "You are";
    echo $_POST["age"];
    echo " years old.";
     ?>
    [​IMG]
     
    نوشته شده توسط saalek110 در ‏13 مارس 2008
    mno و farhad110 از این پست تشکر کرده اند.
  5. farhad110

    farhad110 Member

    ارسال‌ها:
    353
    تشکر شده:
    177
    امتیاز دستاورد:
    16
    نوشته شده توسط farhad110 در ‏13 مارس 2008
    mno و saalek110 از این پست تشکر کرده اند.
  6. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    113
    فرهاد جان ممنون از توجهتان.

    کمی یادآوری php --مربوط به پست قبل.

    در php هر فایل php از چند راه می تواند اطلاعات دریافت کند که 2 راه را من در زیر شرح می دهم.
    می توانیم هر دو سری کد بالا را در یک فایل قرار دهیم و با شرط ابتدا فرم را به کاربر نمایش دهیم و بعد welcome را بدهیم. که جای بحثش اینجا نیست.
     
    نوشته شده توسط saalek110 در ‏13 مارس 2008
    mno از این پست تشکر کرده است.
  7. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    113
    YOUR IP

    http://www.whatismyip.com/
    http://checkip.dyndns.org/
    کد (Text):
    With ICS (http://www.overbyte.be), you can use code such as this:

        FHttpCli.URL           := 'http://www.whatismyip.com/';
        FHttpCli.RcvdStream    := TMemoryStream.Create;
        FHttpCli.Get;
        // Here you write code to analyse the HTML stored in RcvdStream
    منبع
     
    نوشته شده توسط saalek110 در ‏15 مارس 2008
    mno از این پست تشکر کرده است.
  8. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    113
    نوشته شده توسط saalek110 در ‏15 مارس 2008
    mno و farhad110 از این پست تشکر کرده اند.
  9. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    113
    Indy Knowlege Base.pdf

    حجم 200 کیلو.
    http://www.divshare.com/download/4037087-b55

    فهرست:
    کد (Text):
    Table of Contents
    Foreword
    0
    
    Part I
    Introduction
    1
    .................................................................................................................................. 1
    1
    Welcome To the Indy Knowlege Base
    .................................................................................................................................. 1
    2
    Feedback
    Part II
    General Indy Questions
    1
    .................................................................................................................................. 1
    1
    Can I use Indy in my shareware/commercial applications?
    .................................................................................................................................. 1
    2
    What are these "Teams" you have and how can I help?
    .................................................................................................................................. 1
    3
    Where can I find a demo for ___?
    Part III
    Winshoes
    2
    .................................................................................................................................. 2
    1
    What is Winshoes?
    .................................................................................................................................. 2
    2
    Can I use Winshoes 7 and Indy at the same time?
    .................................................................................................................................. 2
    3
    How hard is it to migrate my application from Winshoes 7 to
    Indy?
    Part IV
    Borland Delphi Installlation
    2
    .................................................................................................................................. 2
    1
    How do I install Indy into Borland Delphi?
    .................................................................................................................................. 3
    2
    How do I install Indy 8.0 in Delphi 6 Personal Edition?
    .................................................................................................................................. 3
    3
    In Indy 9.0, I am getting the error "Error on loading Winsock2
    library (WS2_32.DLL)" and it only occurs on Win95 machines.
    .................................................................................................................................. 3
    4
    When I try to compile my application that uses Indy it says it
    cannot find Indy.dcu or some other file?
    .................................................................................................................................. 3
    5
    When I attempt to setup Indy on a fresh copy of Delphi 4.0, it fails
    to compile?
    .................................................................................................................................. 3
    6
    When I try to compile Delphi says it cannot find SyncObjs?
    .................................................................................................................................. 3
    7
    After installing Indy, I am getting an error message such as: "The
    procedure entry point
    @[email protected][email protected] could not be
    located in the dynamic link library Indy60.bpl
    .................................................................................................................................. 4
    8
    After installing Indy, I get a "A device attached to the system is
    not functioning." when loading another package. What do I do
    about it?
    .................................................................................................................................. 4
    9
    Why do you change the Indy API between major Indy versions?
    .................................................................................................................................. 4
    10
    How hard is it to upgrade my code to the latest version of Indy?
    Part V
    Borland C++ Builder Installation
    4
    .................................................................................................................................. 4
    1
    How do I install Indy into Borland C++ Builder?
    
    II
    Contents
    II
    
    © 2003-2005 Chad Z. Hower and the Indy Pit Crew
    .................................................................................................................................. 5
    2
    I tried to install Indy 8.0 in Borland C++ Builder and got missing
    package errors - the files seem to listed okay in the Indy source
    directory.
    .................................................................................................................................. 6
    3
    In Indy 9.0, there is no IndyC60.bpk. What do I do to get Indy to
    work with C++Builder 6?
    
    Part VI
    Exceptions
    6
    .................................................................................................................................. 6
    1
    Why does Indy raise exceptions as part of its normal operation?
    .................................................................................................................................. 7
    2
    Why do I keep getting EIdConnClosedGracefully exceptions?
    .................................................................................................................................. 7
    3
    Why do I get 10038 exceptions raised when I shut down my
    servers?
    .................................................................................................................................. 8
    4
    When I connect with TIdLPR or TIdRSH, I get a
    EIdSocketException saying "Socket Error # 10048 Address
    already in use." Why?
    Part VII
    Socket Programming (Winsock)
    8
    .................................................................................................................................. 8
    1
    What is the difference between blocking and non-blocking
    sockets?
    .................................................................................................................................. 8
    2
    Where can I find Socket error messages explanations, like
    Socket error 10057?
    .................................................................................................................................. 9
    3
    What is an "RFC" and where do I find them?
    Part VIII
    Firewalls and Proxies
    9
    .................................................................................................................................. 9
    1
    How do I use Indy with a Proxy?
    .................................................................................................................................. 10
    2
    How do I use a TIdFTP with a FTP Proxy?
    .................................................................................................................................. 10
    3
    How do I use a TIdFTP with a SOCKS proxy?
    .................................................................................................................................. 11
    4
    How do I use a TIdHTTP with a HTTP Proxy?
    .................................................................................................................................. 12
    5
    How do I use a TIdTCPClient with a HTTP Tunneling Proxy?
    .................................................................................................................................. 12
    6
    How do I use a TIdTCPClient with a SOCKS Proxy?
    .................................................................................................................................. 13
    7
    How do I use a TIdUDPClient with a SOCKS Proxy?
    .................................................................................................................................. 13
    8
    How do I use Indy with a NAT (Network Address Translator)?
    .................................................................................................................................. 14
    9
    How do I use FTP with SSL behind a NAT?
    .................................................................................................................................. 15
    10
    What should I do if I do not know what proxy a user will need to
    use and what the correct settings are?
    Part IX
    Server
    15
    .................................................................................................................................. 15
    1
    How can I send a record using Indy?
    .................................................................................................................................. 16
    2
    How can I send a file using Indy?
    .................................................................................................................................. 16
    3
    Is it safe to access a database connection in a
    TIdTCPServer.OnExecute event?
    .................................................................................................................................. 16
    4
    IHow do I get the Peer's IP Address in the TIdTCPServer?
    Part X
    Ping, ICMP (Internet Control Message
    Protocol), Raw Sockets
    17
    
    Indy Knowlege Base
    III
    
    © 2003-2005 Chad Z. Hower and the Indy Pit Crew
    .................................................................................................................................. 17
    1
    I can not ping with Indy on Windows NT or Windows 2000. What
    do I do about this?
    .................................................................................................................................. 17
    2
    I can not ping with Indy using Linux. What do I do about this?
    
    Part XI
    SMTP (Simple Mail Transport Protocol) and
    E-Mail
    17
    .................................................................................................................................. 17
    1
    How can I send / receive HTML email?
    .................................................................................................................................. 17
    2
    How can I send or receive mail attachments?
    .................................................................................................................................. 18
    3
    Whenever I do a LoadFromFile or a LoadFromStream, I get an
    EIdReadTimeout exception. What am I doing wrong?
    .................................................................................................................................. 18
    4
    How do I send mail directly to a recipients mail server?
    .................................................................................................................................. 19
    5
    How do I send emails through a SMTP server that require
    authentication?
    .................................................................................................................................. 20
    6
    I am using the TIdSMTP but when I try to send mail I get an error
    message such as: "521 potserver.organization.com access
    denied" or "'572 Relay Not Authorized."
    .................................................................................................................................. 20
    7
    I am using the TIdSMTP but when I try to send mail I get an error
    message such as: "530 Must issue a STARTTLS command first"
    .................................................................................................................................. 21
    8
    In C++Builder, a class methods such as TIdSMTP.QuickSend
    require an extra parameter. What parameter should I pass?
    .................................................................................................................................. 21
    9
    Where can I find examples for using the SMTP / POP3 server
    components?
    .................................................................................................................................. 21
    10
    Why doesn't the MAPS Demo work anymore?
    .................................................................................................................................. 21
    11
    A SMTP server is treating E-Mail from my program as if it was
    spam or the server rejects it with a 554 error. I don't have any
    problems with Outlook. How do I fix this?
    .................................................................................................................................. 22
    12
    But that still does not help with SpamAssassin. What now?
    Part XII
    SSL (Secure Sockets Layer) or TLS (Transport
    Layer Security)
    22
    .................................................................................................................................. 22
    1
    Can I legally use and/or export software that uses Indy's SSL
    capabilities?
    .................................................................................................................................. 22
    2
    Where can I download Indy's SSL support .DLL's and
    source-code?
    .................................................................................................................................. 22
    3
    I need SSL help, where can I find answers?
    .................................................................................................................................. 23
    4
    How do I use FTP with SSL?
    .................................................................................................................................. 24
    5
    What is the difference between implicit TLS and explicit TLS?
    Part XIII
    FTP (File Transfer Protocol)
    24
    .................................................................................................................................. 24
    1
    With some servers, when I try to abort a transfer, the client is
    automatically disconnected from the server, instead of aborting
    just the transfer. Is this an Indy bug?
    .................................................................................................................................. 25
    2
    How do I obtain the size of a file I am about to download with
    TIdFTP?
    
    IV
    Contents
    IV
    
    © 2003-2005 Chad Z. Hower and the Indy Pit Crew
    .................................................................................................................................. 25
    3
    I want to download files only if they have been modified on the
    server by comparing the date and time. How do I do this with
    Indy?
    .................................................................................................................................. 26
    4
    In TIdFTP, is there a method to parse the contents of the List
    result, so I can use a ListView component to display the
    directory?
    .................................................................................................................................. 27
    5
    When using the TIdFTP.SetModTime function, why do I get a "no
    such file or directory" but the file exists.
    
    Part XIV
    HTTP (Hypertext Transfer Protocol)
    28
    .................................................................................................................................. 28
    1
    I am getting a 403 Forbidden error with some sites while they
    work fine with Opera, Netscape Communicator, or Internet
    Explorer. How do I fix this?
    Part XV
    IP Multicasting
    28
    .................................................................................................................................. 28
    1
    TTIdIPMCastClient and TIdIPMCastServer do not work on Linux?
    Part XVI
    Migrating to Indy 10
    28
    .................................................................................................................................. 28
    1
    Where is the Intercept property?
    .................................................................................................................................. 29
    2
    TIdFTP.DirectoryListing is returning nothing for my FTP server.
    Why?
    .................................................................................................................................. 29
    3
    Where is the TIdPOP3.APOP property?
    Part XVII
    Miscellaneous Topics
    29
    .................................................................................................................................. 29
    1
    Why did the chicken cross the road?
    Part XVIII
    For Further Reading
    30
    .................................................................................................................................. 30
    1
    Indy Introductory Articles
    .................................................................................................................................. 31
    2
    Socket Programming
    .................................................................................................................................. 31
    3
    RFCs (Request for Comments) and Internet Drafts
    .................................................................................................................................. 32
    4
    Indy Exceptions
    .................................................................................................................................. 32
    5
    HTTP (Hypertext Transfer Protocol)
    .................................................................................................................................. 32
    6
    SSL (Secure Sockets Layer) or TLS (Transport Layer Security)
    .................................................................................................................................. 33
    7
    Web Services
    .................................................................................................................................. 33
    8
    Other Indy Websites
    Index
    34
     
    نوشته شده توسط saalek110 در ‏16 مارس 2008
    mno از این پست تشکر کرده است.
  10. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    113
    نوشته شده توسط saalek110 در ‏16 مارس 2008
    mno از این پست تشکر کرده است.
  11. farhad110

    farhad110 Member

    ارسال‌ها:
    353
    تشکر شده:
    177
    امتیاز دستاورد:
    16
    فقط CHAPTER20 ؟
     
    نوشته شده توسط farhad110 در ‏17 مارس 2008
  12. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    113
    نوشته شده توسط saalek110 در ‏17 مارس 2008
  13. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    113
    منبع:
    http://barnamenevis.org/forum/showthread.php?t=52037
    -----------------------------------------------------------------------

    Indy TCP/IP server Component
    شاید فکر کنید که از قسمت سخت Indy Component شروع میکنیم ، در واقع درست فکر میکنید چون وقتی ساختن یک client را (در مقالات بعدی ) ببنید متوجه میشوید که ساخت یک client چقدر ساده است .

    برای شروع ، یک پروژه جدید ( New Project ) ایجاد کرده ویک IdTcpServer component در آن قرار دهید .( این کامپوننت در برگه Indy Server قرار دارد و اولین کامپوننت است)
    تنظیمات زیر را روی آن اعمال نمایید :
    خوب ... Tcp server شما آماده کار است! بدون اینکه حتی یک خط هم کد نوشته باشید . اگر برنامه خود را اجرا کنید فقط یک صفحه خالی نشان میدهد. برنامه را در حالت Run نگه دارید. برای تست سرور از telnet استفاده میکنیم ( خیلی ساده است ...! اگر مقاله را دنبال کنید)

    کافیست در Command Prompt تایپ کنید :
    کد (Text):
    c:\> telnet 127.0.0.1 1001
    که عدد 127.0.0.1 ip محلی شماست و 1001 هم شماره پورتی است که قبلا ست کرده اید.

    بعد از زدن کلید Enter پیغام hello از طرف سرور برای شما ارسال میشود .(پس ارتباط شما با سرور از پورت 1001 به درستی برقرار شده است .)
    در ضمن فراموش نکنید که برنامه ای که برای سرور نوشته اید حتما باید run شده باشد ( یا بهتر بگویم باید در حال اجرا باشد .)

    پیغام hello که برای شما ارسال شده است در واقع همانGreeting Text property است که شما ست کرده اید پس هر پیغام دیگری میتواند باشد .

    حالا میخواهم برنامه سروررا کمی توسعه دهم. میخواهیم سرور در برابر دستورات ما عکس-العمل نشان دهد .مثلا با تایپ دستور " Responde "، سرور پاسخ دهد که :
    " Ok ! I have Responded "

    این در واقع اولین اجرای دستورات است .

    برای این کار ابتدا مقدار CommandHandlersEnabled را برابر True قرار دهید . سپس روی CommandHandlers property دوبار کلیک کنید و در پنجره ای که باز میشود روی AddNew کلیک کنید . روی Item ای که اضافه میشود کلیک کرده و تنظیمات زیر را روی Property های آن اعمال کنید :
    برنامه را کامپایل و اجرا کنید ... سپس مجدد telnet را مانند قبل اجرا کنید و بعد از دریافت پیغام اولیه ، Respode را تایپ کرده و Enter را بزنید .خواهید دید که پیغام مورد نظر بعنوان پاسخ برگردانده میشود .
     
    نوشته شده توسط saalek110 در ‏17 مارس 2008
  14. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    113
    همان منبع:
    http://barnamenevis.org/forum/showthread.php?t=52037
    -----------------------------------------------------------------------

    اجازه دهید قبل از اینکه برنامه سرور را توسعه دهیم ، نگاهی دقیقتر داشته باشیم به معماری داخلی Indy server . ( البته فرض می شود که خوانندگان عزیز با مفهوم MultiThreading آشنایی مقدماتی را دارند. ) بعد از این بخش شما تقریبا تمامی جنبه های رفتاری یک Indy Server را خواهید فهمید .

    تمام نود های فرزند یک TIDTcpServer دارای رفتار زیر هستند :
    وقتی یک client به سرور متصل میشود ، thread ای که listener نام دارد (و کار آن هم دقیقا همان است که از نام آن بر می آید یعنی دایما در حال گوش دادن است تا ایجاد یک ارتباط جدید که توسط یک client ایجاد شده است را تشخیص دهد ) یک thread جدید ایجاد کرده و وظیفه Handle کردن تمام رخدادهای مربوط به این ارتباط را به آن thread واگذار میکند . پس در معماری داخلی یک سرور دو نوع thread وجود دارد : یکی Listener است که دایم در حالت انتظار برای ایجاد یک ارتباط جدید است و دیگری که بعد از ایجاد Connection بوجود می آید و کلیه وظایف ارتباطی بعهده اوست .

    این معماری زیاد جالب نیست چون client ها هر وقت که بخواهند (بدون توجه به اینکه ممکن است سرور مشغول رسیدگی به دهها درخواست رسیده دیگر باشد ) میتوانند به سرور متصل شوند .
    زیاد نگران نباشید .... چون برای این که بتوان تعداد thread های ایجاد شده را کنترل کرد راه حلهایی وجو د دارد ...
    thread های نوع دوم ( آنهایی که listener نیستند ) را به دو شکل میتوان مدیریت کرد :

    TIdThreadMgrDefault and TIdThreadMgrPool


    قبل از اینکه در باره این دو مدل مدیریت thread ها و نحوه استفاده آنها توضیح دهم میخواهم خود IDThreadDefault و IDThreadPool را خیلی خلاصه معرفی کنم ...

    IDThreadDefault همان حالت پیش فرضی است که اگر ما هیچ تنظیمی را اعمال نکنیم ، اعمال میشود یعنی برای هر Connection یک thread بطور مجزا ایجاد میشود و هنگام خاتمه ارتباط (Disconnect) شدن از بین میرود .(Destroy)

    اما دومی (IDThreadPool) برای سرور هایی طراحی شده است که میخواهند بازدهی بالاتری داشته باشند . حافظه گرفتن و آزاد کردن آن عملی وقت گیر است به همین دلیل در حالت دوم استخری از thread ها (هرتعداد thread ای که شما تعیین کنید ) حافظه allocate میشود و در طول برنامه دیگر عمل گرفتن و آزاد کردن حافظه نخواهیم داشت .

    این کل مفاهیم Thread ها در Indy بود .(ساده و سریع)

    حتما میخواهید بدانید که چطور می توانید مدل thread ای را که میخواهند استفاده کنید را انتخاب کنید. خیلی ساده ... در برگه ی (Tab ( Indy misc شما هر دو نوع

    TIdThreadMgrDefault and TIdThreadMgrPool

    را مشاهده میکنید . کافیست هر کدام را که میخواهید روی فرم خود قرار داده و در
    ThreadMgr Property ی سرور ( IdTCPServer1 ) آن را بعنوان مقدار وارد کنید .
     
    نوشته شده توسط saalek110 در ‏17 مارس 2008
  15. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    113
    همان منبع :
    http://barnamenevis.org/forum/showthread.php?t=52037
    -----------------------------------------------------------------------

    بعد از آشنایی کلی با مفاهیم Threading در Indy ، در این بخش می خواهم کمی بیشتر در باره TIDTcpServer Component صحبت کنم .

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

    مد اول :
    مد اول استفاده از CommandHandlers است . نوشتن سرور در این حالت بسیار ساده است . این مد را با مثال توضیح میدهم تا فهم آن ساده تر و سریعتر باشد :
    فرض کنید که می خواهیم سروری داشته باشیم که در برابر دو دستور Hello و Add عکس العمل مناسب را انجام دهد . در برابر کلمه " Hello " ، کلمه " Hi " را برگرداند. اما دستور " Add " کمی متفاوت است چون میخواهیم با فرستادن چندین عدد به همراه دستور add حاصل جمع آنها را بدست آوریم .فرمت کلی دستور ارسالی ما به سرور به این شکل است :
    و سرور حاصل جمع " no1 + no2 + .... + noN " را برخواهد گرداند .

    مانند مثال اول یک TIDTcpServer روی فرم خود قرار دهید ( یا یک پروژه جدید باز کنید ویا از همان سرور قبلی استفاده کنید یعنی روی یک فرم دو کامپوننت TIDTcpServer نباشد ) . تنظیمات سرور دقیقا همانهایی است که در بخش اول ذکر شده است . حالا روی CommandHandlers دو بار کلیک کرده و در پنجره جدید دو Item جدید ایجاد کنید . برای Item اول مقادیر زیر را ست کنید :
    برای Item دوم هم مقدار Command را برابر کلمه " Add " قرار دهید و ...
    حالا باید یه چند خطی کد نویسی کنید !

    در قسمت Event های Item دوم روی OnCommand دوبار کلیک کنید تا وارد محیط کدنویسی شوید :

    کد (Text):

    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;
     
    به همین سادگی !
    حالا برنامه را کامپایل و اجرا کنید . ( در حالی که برنامه شما Run است ) Telnet را با همان دو مقدار قبل ( یعنی با IP ی 127.0.0.1 و پورت 1001 ) فراخوانی کرده و سرور را تست کنید .

    ( ما تا حالا هیچ فکری برای Handle کردن error های احتمالی نکرده ایم ... چون فعلا هدف ما آموزش مفاهیم است نه نوشتن یک برنامه بی عیب و ایراد )

    اگر مجدد به کدی که نوشته اید نگاه کنید مشاهده خواهید کرد که :
    1- ما از یک Property ی ناآشنا به نام Asender استفاده کردیم .
    2- Asender ،دارای یکسری Property است مثل Connection و یا Params .
    3- نهایتا ما برای ارسال string به Tcp/Ip connection از متد Writeln استفاده کردیم .

    منظور ؟ :
    Asender در واقع همان Client ای است که به ما connect شده است . مطلبی که در باره Thread ها گفتم را که هنوز فراموش نکرده اید ؟ برای هر Client بلافاصله بعد از Connect شدن یک Thread جدید ایجاد میشود . در مورد بالا هم Asender در واقع نمایانگر client ای است که به سرور ما متصل شده است . Asender دارای Property های زیادی است که مهمترین آنها Connection است که درواقع پل ارتباطی ما با کاربر است .توسط آن ما میتوانیم یک String یا Integer ویا حتی یک Record را برای client ارسال کنیم .
     
    نوشته شده توسط saalek110 در ‏17 مارس 2008
  16. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    113
    همان منبع:
    http://barnamenevis.org/forum/showthread.php?t=52037
    -----------------------------------------------------------------------


    همانطور که در انتهای بخش قبل قول داده بودم ، میخواستم درباره حالتی از سرور صحبت کنم که به طور اتومات دربرابر Command های کاربر عکس العمل نشان نمیدهد (مد دوم) ولی بنا به دلایلی این بحث را به آینده موکول میکنم .

    امروز درباره کامپوننت TIDTcpClient توضیح خواهم داد :

    اگر سه بخش قبل را فهمیده باشید ، فهمیدن این قسمت زیاد وقت شما را نمیگیرد.کافیست یک کامپوننت TIDTcpclient (در برگهIndy Client ، اولین کامپوننت است ) را روی فرم جدیدی که ایجاد کرده اید قرار دهید تا 80 درصد راه ساخت client را طی کرده باشید ..!
    20 درصد باقیمانده موضوع این بخش از مقاله است .

    سروری که در بخش قبل ایجاد کردیم را به خاطر بیاورید .. دو دستور داشت به نامهای Hello و Add . میخواهیم client خود را برای برقراری ارتباط با این سرور تنظیم کنیم.


    روی فرم خود علاوه بر کامپوننت TIDTcpClient دو Button ویک Tlistbox هم قرار دهید . در این Listbox شما مقادیری که برای عمل جمع به سرور ارسال خواهید کرد را قرار خواهید داد . حالا باید مقادیر پورت ( Port ) و Host را برای TIDTcpClient ست کنید .

    Port همان است که برای سرور قرار داده اید ( در مثال ما 1001 است ).

    اما Host :
    اگر می خواهید برنامه client را در همان کامپیوتری اجرا کنید که سرور هم روی آن اجرا میشود مقدار Host را برابر 127.0.0.1 قرار دهید وگرنه مقدار آن را برابر با IP کامپیوتر سرور قرار دهید .

    ابتدا دستور Hello :

    روی اولین button دوبار کلیک کرده و کد زیر را وارد کنید :

    کد (Text):

    procedure TForm1.Button1Click(Sender:TObject);
    begin
    with IdTcpClient1 do
    begin
    connect;
    Writeln('Hello');
    ShowMessage(Readln);
    Disconnect;
     
    end;

    end;
     

     

    حالا برنامه را اجرا کنید ( فراموش نکنید که همواره قبل از اجرای برنامه Client حتما باید برنامه سرور را Run کرده باشید وگرنه با پیغام " Socket Error #10061" مواجه خواهید شد ). اگر تمام مراحل را بدرستی طی کرده باشید باید پیغام "Ok, I have responded" دریافت کنید .



    حالا نوبت دومین دستور است . اینبار روی دومین button دوبار کلیک کرده و قطعه کد ساده زیر را وارد کنید :
    کد (Text):
    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;
    تنها تفاوت آن با قبلی این است که در اینجا ما دستور add را با پارامترهایی که در listbox وارد کرده اید ترکیب کرده و حاصل را که یک String است برای سرور ارسال میکنیم.

    نکته :

    هنگام ارسال و دریافت یک پیغام بین Client و Server حتما به ترتیب متد های ارسال دقت لازم را داشته باشید .. مثلا اگر در سمت سرور چیزی مانند زیر داشتید :

    کد (Text):

     
    WriteStream (...);
    Writeln(...);
    ReadStream(...);
     
    در سمت کلاینت باید به این ترتیب باشد :
    کد (Text):

    ReadStream(...);

    ReadLn;
    WriteStram(...);
     
    در حالات دیگر ( اگر ترتیب را رعایت نکنید ) قادر به برقراری درست ارتباط نخواهید بود.

    خوب ... کار Client هم تمام شد . در واقع مطالب مقدماتی ای که فکر میکردم برای شروع کار لازم دارید (تا حد امکان ساده و سریع ) تمام شد .


    منبع اصلی این نوشته را ( که البته بنده سعی کردم ترجمه ای ساده و خلاصه از آن داشته باشم ) می توانید در سایت Delphi3000.com پیدا کنید .
     
    نوشته شده توسط saalek110 در ‏17 مارس 2008
  17. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    113
    http://barnamenevis.org/forum/showthread.php?t=52037&page=2
    -----------------------------------------------------------------------------
    پیاده سازی یک Messenger ساده با استفاده از Indy - سمت سرور

    بسمه تعالی

    بعد از مفاهیم مقدماتی و پایه ای ( که علیرغم سادگی اهمیت فوق العاده ای دارند ) میخواهم ایجاد یک Messenger ساده ( که شامل یک سرور است و می تواند با client خود تبادل اطلاعات کند(در اینجا فقط string)) را آغاز کنم .

    البته در همین ابتدای کار یاد آور شوم که زحمت Handle کردن Exception ها و توسعه برنامه گردن خوانندگان عزیز است چون نمیخواهم با کد های اضافه از خوانایی برنامه کاسته شود .


    ابتدا سمت سرور :

    مطابق شکل ، کامپوننت های زیر را روی فرم اولیه خود قرار دهید :

    TIDTcpServer و memo و edit و button

    [​IMG]

    حالا تنظیمات زیر را برای TIDTcpServer اعمال کنید :
    یک متغیر سراسری به صورت زیر تعریف کنید :
    کد (Text):
     
    mythread : TIdPeerThread ;
    (دلیل استفاده من از این متغیر حفظ اطلاعات Connection ایجاد شده است . اگر کسی راه مناسبتری بلد است ،خوشحال میشوم من را هم راهنمایی کند .)
    این متغیر را در متد onConnect سرور IdTcpserver1 مقدار دهی میکنیم :
    کد (Text):

    procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
    begin
    mythread := athread ;
    end;
     
    سپس در قسمت event ها روی onExecute دو بار کلیک کرده و :

    کد (Text):

    procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
    begin
    Memo1.Lines.Add(AThread.Connection.ReadLn()) ;
    end;
     
    نکته 1 - متد onExecute هرگاه که از طرف Client چیزی برای سرور ارسال شود اجرا میشود ، پس برای دریافت پیغام client مناسبترین متد است .

    نکته 2 - اگر میخواهید هنگام connect شدن Client عمل خاصی انجام دهید ( مثلا چیزی مثل Authentication ) میتوانید از متد onConnect استفاده کنید که فقط یکبار و آن هم هنگامی که یک کاربر به سرور متصل میشود اجرا میشود .

    نکته 3 - همانطور که قبلا هم گفتم هنگام اتصال کاربر به سرور یک Thread جدید ایجاد میشود ، Athread همان thread ایجاد شده است .


    سرور آماده دریافت اطلاعات کاربر و نمایش آن در داخل Memo1 است . ( میتوانید با telnet آن را امتحان کنید)

    برای ارسال پیغام خود به Client ( پیغامی که داخل Textbox نوشته اید ) کافیست کد زیر را در متد onClick دکمه ( Button1 ) وارد کنید :

    کد (Text):

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    mythread.Connection.WriteLn(Edit1.Text);
    end;
     
    خوب اگر از telnet برای امتحان صحت عملکرد سرور خود استفاده کنید خواهید دید که میتوانید به راحتی عملی مانند chat را با سرور داشته باشید .

    حالا نوبت client است . ایجاد client را در بخش بعد خواهم گفت . ( البته اگر عجله دارید خودتان شروع کنید چون با همین معلومات هم میتوان client ای طراحی کرد که با سرور ما کار کند.خیلی ساده است ..! )
     
    نوشته شده توسط saalek110 در ‏17 مارس 2008
  18. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    113
    http://barnamenevis.org/forum/showthread.php?t=52037&page=2
    ----------------------------------------------------------------------------------
    پیاده سازی یک Messenger ساده با استفاده از Indy - سمت کلاینت

    سمت کلاینت :

    روی فرم جدیدی که برای Client ایجاد کرده اید ، کامپوننت های زیر را ( مطابق شکل ) قرار دهید :

    [​IMG]

    TIDTcpClient و memo و button_send و edit_Message
    و
    Edit_ServerIP و Edit_ServerPORT و Button_Connect


    در اولین Editbox که Edit_ServerIP میباشد ، آدرس IP کامپیوتر سرور و یا نام NetBios ای آن را وارد میکنیم و داخل Edit_PORT هم شماره پورت . ( که البته مقدار آن را بصورت پیش فرض طوری قرار داده ام که با پورت 5000 از سروری که در همین کامپیوتر Run شده است ارتباط برقرار کند .)

    حالا روی Button_Connect دو بار کلیک کرده و :

    کد (Text):

    procedure TForm1.Button_connectClick(Sender: TObject);
    begin
    IdTCPClient1.Host := Edit_serverIP.Text ;
    IdTCPClient1.Port := StrToInt(Edit_serverPORT.Text) ;
    IdTCPClient1.Connect();
    Button_connect.Enabled := False ;
    end;
     
    کار دستورات بالا واضح است( بعد از ست کردن Property های کلاینت ، ارتباط را با سرور برقرار میکنند ). آخرین دستور هم باعث جلوگیری از ارسال مجدد درخواست Connect میشود .

    تا الان کار ایجاد ارتباط بین برنامه Client و Server انجام شده است . فقط باید بتوانیم پیغامهای سرور را دریافت و پاسخ دهیم . کافیست Timer ای روی صفحه قرار دهیم (تب System ، اولین کامپوننت ) تا به محض ارسال پیغام از طرف سرور از آن مطلع شویم . کد زیر را هم در onTimer مینویسیم :


    کد (Text):

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
    Timer1.Enabled := False ;
    try
    Memo1.Lines.Add(' Server: ' + IdTCPClient1.ReadLn());
    except on E:Exception do  Form1.Close ;
    end ;
    Timer1.Enabled := True ;
    end;
     
    نکته بسیار مهمی که وجود دارد این است که حتما از کامپوننت IDAntiFreeze ( تب Indy misc ، دومین کامپوننت )در کلاینت خود استفاده کنید . ( دلیل آن را میتوانید در لینک زیر پیدا کنید .)
    http://barnamenevis.org/forum/showth...?t=9385&page=2

    خوب پیامهای سرور را هم دریافت کردیم ... حالا ارسال پیغام به سرور .

    روی Button_send دو بار کلیک کنید و :
    کد (Text):

    procedure TForm1.Button_sendClick(Sender: TObject);
    begin
    IdTCPClient1.WriteLn(Edit_message.Text);
    end;
     
    کار messenger ساده ما تمام شد .

    در ضمن کد های این برنامه را ( البته با تغییرات خیلی جزیی ) میتوانید از آدرس زیر دریافت کنید :
    http://barnamenevis.org/forum/attachment.php?attachmentid=4954&stc=1&d=115797533 2

    موفق باشید ...
     
    نوشته شده توسط saalek110 در ‏17 مارس 2008
  19. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    113
    منبع:
    http://forum.p30world.net/showthread.php?t=200124
    --------------------------------------------------------------------

    برنامه عكس گرفتن از صفحه نمايش بصورت Client/Server

    سلام

    اين مقاله يك ابزار ساده جهت عكس گرفتن از صفحه Desktop ويندوز است كه بصورت Client/Server‌ نوشته شده است.
    با نصب قسمت Clinet روي دستگاه هاي مختلف و اجراي قسمت Server ميتوانيد تصوير Desktop كامپيوترهاي Client را مشاهده نماييد.

    [​IMG]

    ترجمه شده از delphi.about.com

    لينك مقاله بصورت PDF + سورس :
    حجم : 234 كيلوبايت

    http://rapidshare.com/files/89368868/ScreenThief.rar
     
    نوشته شده توسط saalek110 در ‏17 مارس 2008
  20. saalek110

    saalek110 Well-Known Member

    ارسال‌ها:
    2,428
    تشکر شده:
    1,267
    امتیاز دستاورد:
    113
    http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=1492&lngWId=7

    جناب حامد رضایی در سایت planet سورسی برای دانلود فایل گذاشته اند.

    روش ساخت:
    ابتدا urlmon را uses کنید.
    بعد در رویداد یک باتون کد زیر را قرار دهید:
    کد (Text):
      urldownloadtofile(nil,pchar('http://irdelphi.250free.com/g/g2/a1/e1.jpg'),pchar('c:\a.jpg'), 0,nil);
    می توانید سورس را هم دانلود کنید. ولی من ساده شده اش را گفتم.
     
    نوشته شده توسط saalek110 در ‏17 مارس 2008

به اشتراک بگذارید