Delphi Internet Development with ICS
Introduction
Along with Indy
and Synapse, ICS
('Internet Component Suite") is one of the most use open-source set of Internet components. It supports HTTP,
SMTP, ICMP, etc. Support is available through the ICS
mailing list.
Setup
Removing a previous version
- Component > Install Packages : Remove "Overbyte ICS for
Delphi 7"
- From "C:\Program Files\Borland\Delphi7\Projects\Bpl\", delete
OverbyteIcsDel70.bpl and OverbyteIcsDel70.dcp
- Tools > Environment Options > Library > Library Path: Remove
path to previous version of ICS
- File > Close All
Note: "If you are reinstalling, or installing a new version, be sure
to delete all dcu, and obj files from vc32 and internet directories. This applies
to all Win32 versions. When installing a new version, always delete old dcu,
obj, dcpil and always recompile everything ! Close everything before recompiling
the library or packages.When installing a new version, be sure to unzip it in
the same directory tree as the old one or you'll mess both versions."
Fresh install
- Unzip the ICS package
- Launch Delphi, File > Close all
- Open Delphi\Vc32\OverbyteIcsDel70.dpk (OverbyteIcsDel100Package.dpk
is for D2006), Compile, Install, File > Close All
- Tools > Environment Options > Library > Library Path: Add path
to Delphi\Vc32\ where DCU were just compiled
A new FPiette tab is displayed. Some samples are available in Delphi\Internet\
.
Connecting to a socket and TXing/RXing data
Uploading a file with FTP
- FtpClient1.UserName:='mylogin';
- FtpClient1.PassWord:='test';
- FtpClient1.HostName:='ftp.acme.com';
- FtpClient1.Passive := True;
- FtpClient1.LocalFileName:='.\myfile.txt';
- FtpClient1.HostDirName:='/';
- FtpClient1.HostFileName := FtpClient1.LocalFileName;
- try
- FtpClient1.Connect;
- FTPClient1.Binary := True;
- FtpClient1.Put;
- FtpClient1.Quit;
- except
- ShowMessage('Error uploading to FTP');
- end;
Using FTP to upload all the files from a given directory
ICS comes with an FTP client component. There's also a big sample Internet\OverbyteIcsFtpTst1.pas.
Here's how to use the FTPClient component to list all the files in a given
local directory, and upload them all to an FTP server (Note: doesn't recurse
into sub-directories):
- procedure TForm1.Button2Click(Sender: TObject);
- var
- MyFiles : TStringList;
- Path : String;
- SR: TSearchRec;
- I : Integer;
- begin
- ListBox1.Clear;
- If Length(LabeledEdit1.Text) = 0 then begin
- ShowMessage('Choose source directory');
- Exit;
- end;
-
- MyFiles := TStringList.Create;
- try
- Path := LabeledEdit1.Text;
- if FindFirst(Path + '*.*', faAnyFile, SR) =
0 then begin
- repeat
- if (SR.Attr <>
faDirectory) then begin
- MyFiles.Add(SR.Name);
- end;
- until FindNext(SR) <> 0;
- FindClose(SR);
- end;
-
- Button2.Enabled := False;
- //Connect to FTP in BIN + PASSIVE
- FtpClient1.UserName:='joe';
- FtpClient1.PassWord:='mypass';
- FtpClient1.HostName:='ftp.acme.com';
- //Must exist!
- FtpClient1.HostDirName:= LabeledEdit2.Text;
- FtpClient1.Binary := True;
- FtpClient1.Passive := True;
-
- FtpClient1.Connect;
- try
- FtpClient1.Cwd;
- try
- //Upload each file
- for I := 0 to MyFiles.Count-1
do begin
- FtpClient1.LocalFileName:=LabeledEdit1.Text
+ MyFiles[i];
- FtpClient1.HostFileName:=MyFiles[i];
-
- ListBox1.Items.Add('Upload
' + MyFiles[i]);
- PostMessage(Listbox1.Handle,
wm_vscroll, SB_LINEDOWN, 0);
-
- FtpClient1.Put;
- end;
- except
- ShowMessage ('Error
uploading files');
- end;
- FtpClient1.Quit;
- except
- ShowMessage ('Error connecting to
FTP');
- end;
-
- Button2.Enabled := True;
-
- finally
- MyFiles.Free;
- end;
-
- end;
Downloading a web page and displaying its HTML source
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- With HttpCli1 do begin
- URL :=
'www.google.com';
- RequestVer := '1.1';
- RcvdStream := TMemoryStream.Create;
- try
- Get;
- except
- ShowMessage('GET Failed
!');
- RcvdStream.Free;
- Exit;
- end;
-
- RcvdStream.Seek(0,0);
- Memo1.Lines.LoadFromStream(RcvdStream);
- RcvdStream.Free;
- end;
-
- end;
Authenticating with POST + cookie
Downloading a web page through a local proxy
First, create a new application, and add an HttpCli component from the FPiette
tab. Next, add a label and a push button, and paste the following code:
- implementation
-
- const
- MyURL = 'http://www.acme.com';
- MyPROXY = 'localhost';
- MyPORT = '50000';
-
- {$R *.dfm}
-
- procedure TForm1.Button1Click(Sender: TObject);
- var
- I : Integer;
- Response : String;
- begin
- With HttpCli1 do begin
- URL :=
MyURL;
- Proxy :=
MyPROXY;
- ProxyPort := MyPORT;
- RequestVer := '1.1';
- RcvdStream := TMemoryStream.Create;
- try
- Get;
- except
- Response := 'GET Failed
!' + #13#10;
- Response := Response
+ 'StatusCode = ' + IntToStr(HttpCli1.StatusCode) + #13#10;
- Response := Response
+ 'ReasonPhrase = ' + HttpCli1.ReasonPhrase;
- ShowMessage(Response);
- RcvdStream.Free;
- Exit;
- end;
-
- Response := 'StatusCode = ' + IntToStr(StatusCode);
- for I := 0 to RcvdHeader.Count - 1 do begin
- Response := Response + RcvdHeader.Strings[I]
+ #13#10;
- end;
- Label1.Caption := Response;
-
- RcvdStream.Seek(0,0);
- Memo1.Lines.LoadFromStream(RcvdStream);
- RcvdStream.Free;
- end;
-
- end;
Resources