دلفی و شبکه - Indy

saalek110

Well-Known Member
دریافت عکس از شبکه و نمایش آن

اینها را uses کنید:
کد:
 Jpeg, IdBaseComponent, IdComponent,IdTCPConnection, IdTCPClient, IdHTTP;

تابع:
کد:
   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;
رویداد باتون:
کد:
procedure TForm1.Button1Click(Sender: TObject);
begin
    DownloadJPGToBitmap('http://irdelphi.250free.com/g/g2/a2/nature.jpg', Image1.Picture.Bitmap);
end;

a1.gif

اشیای روی فرم : یک باتون و یک ایمیج
 

saalek110

Well-Known Member
ارتباط با php

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

در رویداد باتون کد زیر را قرار دهید:
کد:
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
هم من کد زیر را قرار داده ام:
کد:
<?php
echo "Welcome ";  
echo $_POST["name"]; 
echo "\n";
echo "You are"; 
echo $_POST["age"]; 
echo " years old.";
 ?>

23vnbyx.gif
 

saalek110

Well-Known Member
فرهاد جان ممنون از توجهتان.

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

در php هر فایل php از چند راه می تواند اطلاعات دریافت کند که 2 راه را من در زیر شرح می دهم.
فایل post1.php با محتویات زیر:
کد:
<?php
echo "Welcome ";  
echo $_[COLOR="Blue"]POST[/COLOR]["name"]; 
echo "\n";
echo "You are"; 
echo $_[COLOR="Blue"]POST[/COLOR]["age"]; 
echo " years old.";
 ?>
در اینجا:
http://saalek.awardspace.com/delphi/form/post1.php
آپلود شده. این فایل دارد از یک فرم اطلاعات می گیرد. مثلا فرم زیر که تماما با html است:
کد:
<html>
<body>
<form action="[COLOR="Red"]post1.php[/COLOR]" method="post">
Name: <input type="text" name="name" />
Age: <input type="text" name="age" />
<input type="submit" />
</form>
</body>
</html>

103trf5.gif

کد بالا یک فرم html است که اطلاعات خود را به post1.php می فرستد.
در اینجا آپلود شد:
http://saalek.awardspace.com/delphi/form/form1.html
و اون فایل هم دیدید که welcome می گفت.
می توانیم هر دو سری کد بالا را در یک فایل قرار دهیم و با شرط ابتدا فرم را به کاربر نمایش دهیم و بعد welcome را بدهیم. که جای بحثش اینجا نیست.
حالا به این کد نگاه کنید:
کد:
<?php
echo "Welcome ";  
echo $_[COLOR="Blue"]GET[/COLOR]["name"]; 
echo "\n";
echo "You are"; 
echo $_[COLOR="Blue"]GET[/COLOR]["age"]; 
echo " years old.";
 ?>
که در :
http://saalek.awardspace.com/delphi/form/get1.php
من آپلود کردم.
چنین وارد کنید:
کد:
http://saalek.awardspace.com/delphi/form/get1.php?name=hosein&age=16
در بروسر چنین جواب می گیرید:
کد:
Welcome hosein . You are 16 years old.
در اینجا فایل از url ورودی دریافت کرده.

فایل دیگری با نام request1.php در آدرس:
http://saalek.awardspace.com/delphi/form/request1.php
با کد زیر :
کد:
<?php
echo "Welcome ";  
echo $_[COLOR="Blue"]REQUEST[/COLOR]["name"]; 
echo "\n";
echo "You are"; 
echo $_[COLOR="Blue"]REQUEST[/COLOR]["age"]; 
echo " years old.";
 ?>
آپلود شد. دستور $_REQUEST جایگزین هر دوی $_POST و $_GET است.

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

اولی:
کد:
http://saalek.awardspace.com/delphi/form/request1.php?name=hosein&age=16

دومی:
کد:
<html>
<body>
<form action="[COLOR="Red"]request1.php[/COLOR]" method="post">
Name: <input type="text" name="name" />
Age: <input type="text" name="age" />
<input type="submit" />
</form>
</body>
</html>
در :
http://saalek.awardspace.com/delphi/form/form2.html
 
  • Like
Reactions: mno

saalek110

Well-Known Member
Indy Knowlege Base.pdf

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

فهرست:
کد:
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
@Idglobal@Fetch$qqrr175System@AnsiStringxoxo 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
 
  • Like
Reactions: mno

saalek110

Well-Known Member
منبع:
http://barnamenevis.org/forum/showthread.php?t=52037
-----------------------------------------------------------------------

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

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

کافیست در Command Prompt تایپ کنید :
کد:
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 های آن اعمال کنید :
Command : Responde
ReplyNormalText : ok! I have Responded​
برنامه را کامپایل و اجرا کنید ... سپس مجدد telnet را مانند قبل اجرا کنید و بعد از دریافت پیغام اولیه ، Respode را تایپ کرده و Enter را بزنید .خواهید دید که پیغام مورد نظر بعنوان پاسخ برگردانده میشود .
 

saalek110

Well-Known Member
همان منبع:
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

Well-Known Member
همان منبع :
http://barnamenevis.org/forum/showthread.php?t=52037
-----------------------------------------------------------------------

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

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

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

add no1 no2 .... noN

و سرور حاصل جمع " no1 + no2 + .... + noN " را برخواهد گرداند .

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

Command : Hello
ReplyNormal : Hi
برای Item دوم هم مقدار Command را برابر کلمه " Add " قرار دهید و ...
حالا باید یه چند خطی کد نویسی کنید !

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

کد:
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

Well-Known Member
همان منبع:
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 دوبار کلیک کرده و کد زیر را وارد کنید :

کد:
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 دوبار کلیک کرده و قطعه کد ساده زیر را وارد کنید :
کد:
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 حتما به ترتیب متد های ارسال دقت لازم را داشته باشید .. مثلا اگر در سمت سرور چیزی مانند زیر داشتید :

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

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

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


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

saalek110

Well-Known Member
http://barnamenevis.org/forum/showthread.php?t=52037&page=2
-----------------------------------------------------------------------------
پیاده سازی یک Messenger ساده با استفاده از Indy - سمت سرور

بسمه تعالی

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

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


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

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

TIDTcpServer و memo و edit و button

2e4hyrt.jpg

حالا تنظیمات زیر را برای TIDTcpServer اعمال کنید :

Active : true
DefaultPort : 5000

یک متغیر سراسری به صورت زیر تعریف کنید :
کد:
mythread : TIdPeerThread ;
(دلیل استفاده من از این متغیر حفظ اطلاعات Connection ایجاد شده است . اگر کسی راه مناسبتری بلد است ،خوشحال میشوم من را هم راهنمایی کند .)
این متغیر را در متد onConnect سرور IdTcpserver1 مقدار دهی میکنیم :
کد:
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
mythread := athread ;
end;
سپس در قسمت event ها روی onExecute دو بار کلیک کرده و :

کد:
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 ) وارد کنید :

کد:
procedure TForm1.Button1Click(Sender: TObject);
begin
mythread.Connection.WriteLn(Edit1.Text);
end;

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

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

saalek110

Well-Known Member
http://barnamenevis.org/forum/showthread.php?t=52037&page=2
----------------------------------------------------------------------------------
پیاده سازی یک Messenger ساده با استفاده از Indy - سمت کلاینت

سمت کلاینت :

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

20zv6va.jpg

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


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

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

کد:
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 مینویسیم :


کد:
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 دو بار کلیک کنید و :
کد:
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

Well-Known Member
منبع:
http://forum.p30world.net/showthread.php?t=200124
--------------------------------------------------------------------

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

سلام

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

s5xq9i9o0pqfeht2cy00.png

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

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

http://rapidshare.com/files/89368868/ScreenThief.rar
 

saalek110

Well-Known Member
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=1492&lngWId=7

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

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

می توانید سورس را هم دانلود کنید. ولی من ساده شده اش را گفتم.
 

جدیدترین ارسال ها

بالا