แอปพลิเคชัน Delphi ส่งข้อมูลไปยังเซิร์ฟเวอร์โดยใช้วิธี POST (Indy) ส่วนประกอบอินดี้ที่ใช้ใน Delphi

Indy เป็นแพ็คเกจส่วนประกอบที่ทรงพลังซึ่งช่วยให้คุณพัฒนาแอพพลิเคชั่นเครือข่ายต่างๆ ในบทช่วยสอนนี้ ฉันจะบอกคุณว่าคุณสามารถสร้างแอปพลิเคชันไคลเอนต์-เซิร์ฟเวอร์โดยใช้ส่วนประกอบ TIdTCPClient และ TIdTCPServer ได้อย่างไร

ก่อนอื่น ฉันอยากจะทราบข้อดีที่สำคัญสองประการของส่วนประกอบเหล่านี้ สิ่งที่สำคัญที่สุดคือมัลติเธรดซึ่งหมายความว่าเซิร์ฟเวอร์สร้างเธรดแยกต่างหากสำหรับไคลเอนต์แต่ละรายและสิ่งนี้ส่งผลต่อประสิทธิภาพของโปรแกรมเซิร์ฟเวอร์บนคอมพิวเตอร์ที่มีโปรเซสเซอร์แบบมัลติคอร์อย่างแน่นอน ข้อดีประการที่สองคือใช้งานง่าย โค้ด 10-20 บรรทัดก็เพียงพอแล้วสำหรับการเขียนแอปพลิเคชันไคลเอนต์-เซิร์ฟเวอร์อย่างง่าย แพคเกจส่วนประกอบนี้มีอยู่ในชุดประกอบ Delphi มาตรฐาน

มาเขียนกันเถอะ โปรแกรมง่ายๆซึ่งช่วยให้คุณสามารถถ่ายโอนข้อความจากไคลเอ็นต์ไปยังเซิร์ฟเวอร์ได้ มาเริ่มสร้างเซิร์ฟเวอร์กันดีกว่า
มาวางคอมโพเนนต์ IdTCPServer จากแท็บ "Indy Servers" ลงในแบบฟอร์ม เราจะทำการตั้งค่าทั้งหมดสำหรับส่วนประกอบนี้ขณะรันไทม์ในเหตุการณ์ OnCreate ของแบบฟอร์ม:
IdTCPServer1.DefaultPort:= 12345;
IdTCPServer1.Active:= จริง;
ทุกอย่างเป็นเรื่องง่ายที่นี่ - เราระบุพอร์ตที่เซิร์ฟเวอร์จะทำงานและเปิดใช้งานเซิร์ฟเวอร์เอง

ในการรับข้อมูลบนเซิร์ฟเวอร์จากไคลเอนต์ จะมีกิจกรรมพิเศษ “OnExecute” เหตุการณ์นี้มีลักษณะเช่นนี้:

เริ่ม
จบ;

ขอแก้ไขเนื้อหากิจกรรมดังนี้:
ขั้นตอน TForm3.IdTCPServer1Execute (AContext: TIdContext);
var
ล:สตริง; // ตัวแปรสตริงที่เราจะได้รับ
เริ่ม
l:= AContext.Connection.IOHandler.ReadLn();
Memo1.Lines.Add(l);
จบ;

ตอนนี้ ทันทีที่ข้อความมาถึงเซิร์ฟเวอร์ เราจะเขียนมันลงในตัวแปรสตริง l และส่งออกไปยังช่องข้อความหลายบรรทัด

ไม่น่าแปลกใจเลยที่สิ่งนี้จะยุติการสร้างเซิร์ฟเวอร์ อินดี้จะทำส่วนที่เหลือให้เรา เริ่มจากโปรแกรมไคลเอนต์กันก่อน มันจะเชื่อมต่อกับเซิร์ฟเวอร์ ส่งข้อความถึงเซิร์ฟเวอร์ และตัดการเชื่อมต่อจากเซิร์ฟเวอร์

มาสร้างกันเถอะ โครงการใหม่วางองค์ประกอบ IdTCPClient ลงในแบบฟอร์ม ซึ่งสามารถพบได้ในแท็บ "Indy Clients" นอกจากนี้เราจะวางปุ่มแก้ไขและปุ่มง่ายๆ ไว้ด้วย มาสร้างตัวจัดการเหตุการณ์ OnClick สำหรับปุ่มกัน ซึ่งภายในเราจะเขียนว่า:
IdTCPClient1.พอร์ต:= 12345;
IdTCPClient1.โฮสต์:= '127.0.0.1';
IdTCPClient1.เชื่อมต่อ;
IdTCPClient1.IOHandler.WriteLn (แก้ไข1.ข้อความ);
IdTCPClient1.ตัดการเชื่อมต่อ;

ไม่จำเป็นต้องวางรหัสนี้ในเหตุการณ์ OnCreate คุณสามารถวางรหัสนี้ได้ทุกที่ที่คุณต้องการหากต้องการ
ในบรรทัดแรกเรากำหนดพอร์ตและจำเป็นต้องระบุพอร์ตเดียวกับที่เราระบุไว้ในโปรแกรมเซิร์ฟเวอร์ มิฉะนั้นไคลเอนต์ก็จะไม่พบเซิร์ฟเวอร์ จากนั้นเราจะระบุที่อยู่ IP ของเซิร์ฟเวอร์ เซิร์ฟเวอร์นั้นสามารถตั้งอยู่ได้ทั้งใน เครือข่ายท้องถิ่นและจากระยะไกล ในกรณีหลังนี้ จะทำการเชื่อมต่อผ่านอินเทอร์เน็ต และคุณจะต้องระบุที่อยู่ IP บนอินเทอร์เน็ต

ฉันระบุที่อยู่ “127.0.0.1” ซึ่งหมายความว่าเซิร์ฟเวอร์คือคอมพิวเตอร์ที่ไคลเอนต์ใช้งานอยู่ วิธีนี้สะดวกมากสำหรับการทดสอบแอปพลิเคชันเครือข่าย
จากนั้นเราจะทำการเชื่อมต่อ ส่งข้อความ และตัดการเชื่อมต่อ เช่นเดียวกับตัวข้อความ คุณยังสามารถรับที่อยู่ IP จากการแก้ไขหรือจากตัวแปรสตริงใดก็ได้

งานในโปรแกรมไคลเอนต์ก็เสร็จสมบูรณ์เช่นกัน อย่างที่คุณเห็น Indy ทำงานให้เราได้อย่างยอดเยี่ยมซึ่งทำให้แม้แต่โปรแกรมเมอร์ที่ไม่มีประสบการณ์ก็สามารถสร้างแอปพลิเคชันเครือข่ายของตนเองได้

โปรโตคอล UDP ค่อนข้างดีสำหรับการส่งข้อมูล ข้อความนั่นคือคุณสามารถจัดระเบียบการแชทในพื้นที่และสิ่งที่คล้ายกันได้ ฉันตัดสินใจยกตัวอย่างงานที่ง่ายที่สุดกับ UDP ใน Delphi

คำแนะนำทีละขั้นตอน:

ผมยกตัวอย่างแต่ขออภัยที่ผมเขียนไม่ครบทุกบรรทัดเพราะ... ฉันไม่เห็นอะไรซับซ้อนและใครๆ ก็สามารถเข้าใจได้

ที่จริงแล้วหากมีอะไรไม่ชัดเจนคุณสามารถถามคำถามฉันได้ และนี่คือรหัสจริง:

การใช้งาน
Windows, ข้อความ, SysUtils, ตัวแปร, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม,
กล่องโต้ตอบ, StdCtrls, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase,
IdUDPClient, IdSocketHandle;

พิมพ์
TForm1 = คลาส (TForm)
IdUDPClient1: TIdUDPClient;
IdUDPServer1: TIdUDPServer;
Button1: T ปุ่ม;
Label1: TLabel;
ขั้นตอน FormCreate (ผู้ส่ง: TObject);
ขั้นตอน FormClose (ผู้ส่ง: TObject; var Action: TCloseAction);
ขั้นตอน Button1Click (ผู้ส่ง: TObject);
ขั้นตอน IdUDPServer1UDPRead (AThread: TIdUDPListenerThread; AData: TBytes;
การเชื่อมโยง: TIdSocketHandle);
ส่วนตัว
(ประกาศส่วนตัว)
สาธารณะ
(ประกาศสาธารณะ)
จบ;

var
แบบฟอร์ม 1: TForm1;

($R *.dfm)
[b]//ขั้นตอนการส่งข้อความ
ขั้นตอน TForm1.Button1Click (ผู้ส่ง: TObject);
เริ่ม
พยายาม
IdUDPClient1.Active:= จริง;
IdUDPClient1.Host:= "localhost";
IdUDPClient1.เชื่อมต่อ;
ถ้า IdUDPClient1 เชื่อมต่อแล้ว
เริ่ม
IdUDPClient1.Send (TimeToStr (เวลา));
Label1.Caption:= "ตกลง";
จบ;
IdUDPClient1.Active:= เท็จ;
บี๊บบี๊บบี๊บ;
ยกเว้น
MessageDlg("มีข้อผิดพลาดเกิดขึ้น =(", mtError, , 0);
จบ;
จบ;
[ข]
//เปิดปิด. เซิร์ฟเวอร์ UDP เมื่อเริ่มและปิดแบบฟอร์ม
ขั้นตอน TForm1.FormClose (ผู้ส่ง: TObject; var Action: TCloseAction);
เริ่ม
IdUDPServer1.Active:= เท็จ;
จบ;

ขั้นตอน TForm1.FormCreate (ผู้ส่ง: TObject);
เริ่ม
IdUDPServer1.Active:= จริง;
จบ;

[b]//ขั้นตอนการตอบสนองของเซิร์ฟเวอร์เมื่อรับข้อมูล
ขั้นตอน TForm1.IdUDPServer1UDPRead (ATThread: TIdUDPListenerThread;
ข้อมูล: TBytes; การเชื่อมโยง: TIdSocketHandle);
วาร์
ฉัน:จำนวนเต็ม;
s:สตริง;
เริ่ม
ส:= "";
พยายาม
ฉัน:= 0;
ในขณะที่ (AData[i] 0) ทำ
เริ่ม
s:= s + chr(AData[i]);
ฉัน:= ฉัน + 1;
จบ;
ในที่สุด
Label1.Caption:= s;
จบ;
จบ;

แซร์จ โดซูคอฟ ไมค์ ฟาม

บทความนี้จะแสดงวิธีสร้างบริการบนเว็บแบบสแตนด์อโลนโดยใช้ Indy kit และ Delphi 7 และวิธีใช้ Indy kit เพื่อรองรับบริการบนเว็บที่ใช้ SOAP ของ Delphi 7 ด้านหลัง ข้อมูลเพิ่มเติมสำหรับข้อมูลเกี่ยวกับการสร้างบริการบนเว็บ โปรดดูบทความที่ยอดเยี่ยมของ Nick Hodges บนไซต์ชุมชน Borland: Shakespeare on the Web

ไม่ช้าก็เร็ว คุณอาจต้องสร้างเซิร์ฟเวอร์ที่เป็นเซิร์ฟเวอร์ HTTP แบบสแตนด์อโลนและรองรับบริการบนเว็บ ตัวอย่างเช่น คุณอาจต้องการสร้างแอปพลิเคชันเซิร์ฟเวอร์ที่ใช้ SOAP สำหรับแอปพลิเคชันระดับ n ที่สร้างโดยใช้ Delphi

การแนะนำ

ความช่วยเหลือออนไลน์ของ Delphi นั้นยอดเยี่ยมมาก การเรียนการสอนตามลำดับเกี่ยวกับวิธีสร้างบริการเว็บเซิร์ฟเวอร์ MIDAS (รุ่น COM, DCOM) แต่ในทางปฏิบัติแล้วไม่มีข้อมูลเกี่ยวกับการสร้างแอปพลิเคชัน MIDAS n-tier แบบสแตนด์อโลนที่ใช้โปรโตคอล SOAP

เผยแพร่ก่อนหน้านี้โดย Dave Nottage บทความนี้อธิบายแนวคิดของวิธีสร้างบริการเว็บใน Delphi 6 ด้วยการสนับสนุน SOAP และความสามารถในการเผยแพร่อินเทอร์เฟซ SOAP ของ Datamodule นั่นคือบทความนี้อนุญาตให้คุณเรียนรู้วิธีสร้าง n-tier ของคุณเอง ระบบไมดาส

Delphi 7 ของ Borland และชุด Indy ใหม่รองรับฟังก์ชันนี้ในตัว

อย่างไรก็ตาม แม้จะรองรับในตัวแล้ว แต่ฟีเจอร์นี้ก็ไม่ได้รับการบันทึกไว้

การโพสต์ล่าสุดในการประชุมเครือข่าย Borland และการค้นหาเว็บโดยใช้เซิร์ฟเวอร์ของ Google ทำให้ผู้เขียนสามารถพัฒนาวิธีการแปลงโค้ดที่มีอยู่จาก Delphi 6 เป็น Delphi 7 ได้ แต่ทุกอย่างมีเวลาของมัน

แนวคิดหลัก

บทความนี้เป็นส่วนแรกของซีรี่ส์สามส่วน มันอธิบายบทบัญญัติหลัก ส่วนที่สองและสามจะกล่าวถึงปัญหาและแนวทางแก้ไข เรามาเริ่มอธิบายแนวคิดหลักกันดีกว่า

  • เป็นเซิร์ฟเวอร์ HTTP แบบสแตนด์อโลน
  • ใช้ Indy เป็นแพลตฟอร์ม
  • รองรับการเผยแพร่ผ่านโปรโตคอล SOAP
  • สามารถเผยแพร่ SOAP DataModules ได้ ซึ่งจะช่วยให้คุณสร้างเซิร์ฟเวอร์ n-tier ของคุณเองโดยใช้ SOAP/HTML

เซิร์ฟเวอร์ HTTP และ SOAP

หลายๆ คนรู้จัก Indy และเคยใช้ส่วนประกอบของ THTTPServer มาก่อน เป็นเรื่องง่ายที่จะใส่ส่วนประกอบนี้ลงในแบบฟอร์มใบสมัคร แต่คุณจะทำให้ส่วนประกอบนี้รองรับ SOAP ได้อย่างไร ในไดเร็กทอรี "C:Program FilesBorlandDelphi7SourceIndy" คุณจะพบไฟล์ IdHTTPWebBrokerBridge.pas นี่คือสิ่งที่คุณต้องการ

ไฟล์นี้ไม่ได้เป็นส่วนหนึ่งของไฟล์ปฏิบัติการ Indy ดังนั้นคุณต้องรวมไว้ในโปรเจ็กต์ปัจจุบันของคุณเป็นไฟล์โปรเจ็กต์มาตรฐาน (ในการคอมไพล์โปรเจ็กต์ คุณจะต้องมีไฟล์ IdCompilerDefines.inc ด้วย) ไฟล์เหล่านี้จะต้องถูกคัดลอกไปยังไดเร็กทอรีโปรเจ็กต์ปัจจุบัน อาจจำเป็นต้องเปลี่ยนแปลงโค้ดเพื่อเพิ่มความเร็ว ดังนั้นจึงควรแยกไฟล์เหล่านี้ออกจาก Indy Distribution

ข้อมูลต่อไปนี้จะอธิบายการใช้งานส่วนประกอบทดแทนจาก THTTPServer ซึ่งขยายเพื่อรองรับแพ็กเก็ต SOAP ที่เรียกว่า TIdHTTPWebBrokerBridge โครงสร้างนี้เป็นคลาสที่สืบทอดมาจาก TCustomHTTPServer และรองรับการผูกคำขอพื้นฐาน

เนื่องจากคลาสนี้ไม่สามารถเข้าถึงได้จากพาเล็ต คุณจะต้องกำหนดคลาสนี้เป็นออบเจ็กต์ปกติเมื่อรันโค้ดของคุณ

อ็อบเจ็กต์นี้สามารถใช้ได้ในลักษณะเดียวกับ THTTPServer ทั่วไปทุกประการ ยกเว้นคุณสมบัติเพิ่มเติมที่เปิดใช้งานการดำเนินการกับ SOAP
อย่างไรก็ตาม มาดูการเตรียมโค้ดที่จำเป็นกันก่อน

เว็บโบรคเกอร์และอินดี้

สำหรับผู้ที่เคยสร้างเว็บเซอร์วิสมาก่อนก็รู้ว่าใช้งาน เว็บโบรคเกอร์. Delphi 7 เช่นเดียวกับ Delphi 6 ใช้สถาปัตยกรรม WebBroker เพื่อรองรับ SOAP

ดังนั้นคุณต้องสร้างโมดูลขึ้นมา TWebModuleและวางคอมโพเนนต์สามรายการต่อไปนี้ลงไป: THHTTPSoapDispatcher, THHTTPSoapPascalInviver และ TWSDLHTMLPublish ทั้งหมดนี้มีอยู่ในแท็บ WebServices ของพาเล็ตส่วนประกอบ หลังจากเชื่อมโยง SOAPDispatcher กับ SOAPPascalInvacer แล้ว แบบฟอร์มใบสมัครก็พร้อมแล้ว ผลลัพธ์ที่ได้ควรเป็นสิ่งที่แสดงในรูปต่อไปนี้:

(โมดูล uWebModule.pas)

ทางที่ดีควรปล่อยให้ทุกอย่างเหมือนเดิม เนื่องจากไม่จำเป็นต้องเปลี่ยนแปลงหรือรันโค้ดที่กำหนดเองใดๆ สำหรับแบบฟอร์มนี้

เว็บโมดูลและอินดี้

มาดูส่วนอื่นๆ ของโค้ดที่จำเป็นในการใช้งานเซิร์ฟเวอร์ HTTP กัน

อย่างที่คุณเห็น TIdHTTPWebBrokerBridge มีเมธอด RegisterWebModuleClass ซึ่งช่วยให้คุณสามารถลงทะเบียน WebModule ของคุณเองและทำให้พร้อมใช้งานบนเซิร์ฟเวอร์

ดังนั้น หลังจากสร้างอ็อบเจ็กต์เซิร์ฟเวอร์ fServer คุณเพียงแค่ต้องเรียกคลาส fServer.RegisterWebModuleClass (TwmSOAPIndy)

บันทึก.ในการใช้งาน TIdHTTPWebBrokerBridge ตามปกติ ออบเจ็กต์ TwmSOAPIndy จะถูกสร้างขึ้นทุกครั้งที่ได้รับการร้องขอ แน่นอนว่านี่ไม่จำเป็น ดังนั้นจึงสามารถแก้ไขคลาสเพื่อสร้างการสร้างถาวรได้ ของวัตถุชิ้นนี้ตราบใดที่วัตถุเซิร์ฟเวอร์มีอยู่ ขอแนะนำให้คุณดูเอกสารประกอบการใช้งานคลาสสำหรับข้อมูลเพิ่มเติม

เซิร์ฟเวอร์พร้อมหรือยัง?

ส่วนประกอบอินดี้ที่ใช้ใน Delphi 6

นอกเหนือจากบริการอินเทอร์เน็ตและโปรโตคอลขั้นพื้นฐานแล้ว ยังมีบริการเพิ่มเติมอีกมากมาย ซึ่งนักพัฒนาอินเทอร์เน็ตมักใช้ความสามารถนี้ นอกจากนี้ ความสามารถในการแสดงข้อมูลโดยใช้เบราว์เซอร์อาจไม่ใช่วิธีแก้ปัญหาที่ยอมรับได้สำหรับแอปพลิเคชันอินเทอร์เน็ตเสมอไป ในกรณีนี้ มีความสมเหตุสมผลที่จะใช้โครงสร้างพื้นฐานอินเทอร์เน็ตสำหรับการแลกเปลี่ยนข้อมูล และแสดงข้อมูลโดยใช้แอปพลิเคชันไคลเอนต์ที่ซับซ้อนมากขึ้นที่พัฒนาขึ้น เช่น ใน Delphi

สมมติว่าคุณต้องใช้ตรรกะเซิร์ฟเวอร์พิเศษที่ไม่รวมอยู่ในเว็บเซิร์ฟเวอร์มาตรฐาน เพื่อแก้ไขปัญหาประเภทนี้ Delphi ได้รวมไลบรารี Internet Direct (Indy) จาก Nevrona Designs (http://www.nevrona.com/Indy/) ไลบรารีนี้พัฒนาขึ้นสำหรับ Borland Delphi โดยเฉพาะ มีอยู่แล้ว 8 เวอร์ชัน ซึ่งเวอร์ชันล่าสุดรวมอยู่ในนั้นด้วย เวอร์ชั่นใหม่เดลฟี. ชุดส่วนประกอบแบ่งออกเป็นสามกลุ่ม: ไคลเอนต์ (Indy Client), เซิร์ฟเวอร์ (Indy Servers) และเสริม (Indy Misc)

ลูกค้า Indy และเซิร์ฟเวอร์ Indy

ส่วนใหญ่ ส่วนประกอบอินดี้ไคลเอนต์และเซิร์ฟเวอร์ Indy เป็นคู่ที่สอดคล้องกับส่วนของไคลเอนต์และเซิร์ฟเวอร์ของโปรโตคอลและบริการ (ยกเว้นแต่ละรายการ ซึ่งส่วนใหญ่เป็นส่วนประกอบบนเซิร์ฟเวอร์ เช่น TunnelMaster และ TunnelSlave) และอนุญาตให้ใช้โปรโตคอล เช่น TCP/IP, UDP, NNTP, SMTP, FTP , HTTP รวมถึงบริการ ECHO, FINGER, WHOIS ฯลฯ

ส่วนประกอบไคลเอนต์ Indy เขียนโดยใช้ซ็อกเก็ต ซ็อกเก็ตฝั่งไคลเอ็นต์จำเป็นต้องเชื่อมต่อกับเซิร์ฟเวอร์ หากสร้างการเชื่อมต่อแล้ว ไคลเอนต์และเซิร์ฟเวอร์สามารถเริ่มแลกเปลี่ยนข้อความได้ ข้อความเหล่านี้มีลักษณะที่แตกต่างกัน แต่โดยปกติแล้วการแลกเปลี่ยนจะเกิดขึ้นโดยใช้โปรโตคอลเฉพาะ (เช่น HTTP)

TIdTCPClient และ TIdTCPServer

ส่วนประกอบเหล่านี้ใช้เพื่อรองรับหนึ่งในโปรโตคอลเครือข่ายหลัก - TCP (Transmission Control Protocol) และยังเป็นคลาสพื้นฐานสำหรับส่วนประกอบ TIdSMTP และ TIdFTP คลาส TIdTCPServer มีคุณสมบัติ ThreadMgr ที่มีค่าเริ่มต้นเป็นศูนย์ ถ้า ThreadMgr เป็นศูนย์เมื่อเปิดใช้งาน TIdTCPServer คลาส TIdThreadMgrDeafault จะถูกสร้างขึ้นโดยปริยาย มิฉะนั้น จะใช้ตัวจัดการกระบวนการที่ติดตั้งไว้

TIdUDPClient และ TIdUDPServer

ส่วนประกอบเหล่านี้ใช้เพื่อรองรับ โปรโตคอลเครือข่าย UDP (User Datagram Protocol) และยังเป็นคลาสพื้นฐานสำหรับส่วนประกอบ Indy อื่นๆ อีกจำนวนหนึ่ง

TIdChargenServer

ส่วนประกอบนี้ใช้เพื่อสร้างสัญลักษณ์สุ่ม โดยปกติแล้วใช้เพื่อการทดสอบ

TIdDayTime และ TIdDayTimeServer

ส่วนประกอบต่างๆ ใช้เพื่อให้บริการด้านเวลา ไคลเอนต์ร้องขอและเซิร์ฟเวอร์รายงานวันที่และเวลาปัจจุบัน

TIdDNSResolver

นี่คือส่วนประกอบไคลเอนต์ที่ให้บริการคำขอจากเซิร์ฟเวอร์ DNS (บริการชื่อโดเมน) การสืบค้นเซิร์ฟเวอร์ DNS ได้รับการออกแบบมาเพื่อแทนที่ชื่อคอมพิวเตอร์ด้วยที่อยู่ IP TIdDNSResolver เป็นผู้สืบทอดของคลาส TIdUDPClient

TIdDICTเซิร์ฟเวอร์

ส่วนประกอบเซิร์ฟเวอร์ที่รองรับ Dictionary Server Protocol (DICT) ซึ่งเป็นพจนานุกรมฝั่งเซิร์ฟเวอร์ที่ใช้โปรโตคอล TCP ที่อนุญาตให้ไคลเอนต์เข้าถึงพจนานุกรมภาษาธรรมชาติ

TIdDISCARDเซิร์ฟเวอร์

ส่วนประกอบเซิร์ฟเวอร์ที่รองรับเซิร์ฟเวอร์บันทึก การบันทึกสามารถใช้เป็นเครื่องมือแก้ไขและวัดผลได้ บริการบันทึกจะส่งข้อมูลใดๆ ให้กับใครก็ตามที่ยินดีรับข้อมูลนั้น

TI dEcho และ TI dECHOServer

ส่วนประกอบต่างๆ ได้รับการออกแบบมาเพื่อให้บริการตอบสนอง ซึ่งโดยทั่วไปจะใช้เพื่อตรวจสอบความสมบูรณ์ของเครือข่าย ลูกค้าส่งข้อความไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์ส่งข้อความกลับไปยังลูกค้า หากข้อความอ่านไม่ออก แสดงว่าเครือข่ายทำงานผิดปกติ

TIdFinger และ TIdFingerServer

ส่วนประกอบต่างๆ ได้รับการออกแบบมาเพื่อจัดเตรียมโปรโตคอลที่ช่วยให้ผู้ใช้สามารถสืบค้นข้อมูลเกี่ยวกับการมีอยู่ของผู้ใช้รายอื่นในระบบได้ เซิร์ฟเวอร์บางแห่งจัดการคำขอไคลเอนต์ดังกล่าว การใช้ส่วนประกอบคู่นี้จะช่วยให้คุณสามารถให้บริการตามคำขอของลูกค้าที่กำหนดว่ามีผู้ใช้รายอื่นอยู่ในระบบ

ส่วนประกอบนี้รวมถึงการรองรับโปรโตคอลการถ่ายโอนไฟล์อย่างเต็มรูปแบบ - FTP (File Transfer Protocol) รองรับการถ่ายโอนข้อมูลแบบพาสซีฟและแอคทีฟ รวมถึงการดำเนินการเช่น GET และ PUT การลบไดเร็กทอรี การรับโควต้า ขนาดไฟล์และไดเร็กทอรี TI dFTP ใช้คลาส TIdSimpleServer เพื่อดำเนินการ เมื่อดำเนินการถ่ายโอนไฟล์ FTP การเชื่อมต่อ TCP รองจะถูกเปิดสำหรับการถ่ายโอนข้อมูล และจะปิดลงเมื่อมีการถ่ายโอนข้อมูล การเชื่อมต่อนี้เรียกว่า "ดาต้าลิงค์" ซึ่งไม่ซ้ำกันสำหรับแต่ละไฟล์ที่กำลังถ่ายโอน

TIdGopher และ TIdGopherServer

ส่วนประกอบเหล่านี้ได้รับการออกแบบเพื่อให้มีโปรโตคอลเครือข่ายที่ถูกแทนที่ เมื่อเร็วๆ นี้จาก WWW ( ทั่วโลกเว็บ) โปรโตคอล HTTP เซิร์ฟเวอร์ที่ใช้โปรโตคอลนี้จัดเตรียมระบบสนับสนุนโฟลว์เอกสารแบบกระจายแบบลำดับชั้น ตัวอย่างของการใช้คอมโพเนนต์คู่นี้ ซึ่งอยู่ในไดเร็กทอรี demosindyGopherClient และ demosindy GopherServer แสดงให้เห็นว่าการใช้โปรโตคอลนี้ทำให้คุณสามารถให้ข้อมูลเกี่ยวกับไฟล์บนคอมพิวเตอร์ของคุณ รวมถึงไฟล์ที่ถูกปิดบนเครือข่ายท้องถิ่นได้อย่างไร

TIdHostNameServer

ส่วนประกอบเซิร์ฟเวอร์ที่ออกแบบมาเพื่อส่งชื่อเซิร์ฟเวอร์ภายในเครื่องไปยังไคลเอนต์

TIdHTTP และ TIdHTTPServer

ส่วนประกอบต่างๆ ใช้เพื่อจัดเตรียมโปรโตคอลเครือข่าย HTTP (รองรับเวอร์ชัน 1.0 และ 1.1 รวมถึงการดำเนินการ GET, POST และ HEAD) นอกจากนี้ยังมีการสนับสนุนสำหรับการตรวจสอบสิทธิ์และการใช้พร็อกซีเซิร์ฟเวอร์ ส่วนประกอบเซิร์ฟเวอร์ใช้เพื่อให้บริการแก่เว็บเซิร์ฟเวอร์อื่นที่รองรับโปรโตคอลที่กำหนด TIdHTTPServer อำนวยความสะดวกในการใช้งานฟังก์ชันต่างๆ เช่น คุกกี้ การจัดการสถานะ ฯลฯ

TIdIcmpClient

ส่วนประกอบไคลเอ็นต์ที่ออกแบบมาเพื่อจัดเตรียม Internet Control Message Protocol (ICMP) ซึ่งใช้ในการดำเนินการ Ping และการติดตามเครือข่าย

ส่วนประกอบไคลเอ็นต์ที่ออกแบบมาเพื่อจัดเตรียม Post Office Protocol (POP) รวมถึงการสนับสนุนการเข้ารหัสและถอดรหัส MIME และการส่งอักขระแบบหลายไบต์

TIdIMAP4เซิร์ฟเวอร์

ส่วนประกอบเซิร์ฟเวอร์ที่ออกแบบมาเพื่อรองรับการดำเนินการ IMAP (Internet Message Access Protocol) บนเซิร์ฟเวอร์ โปรโตคอลช่วยให้คุณค้นหาข้อความได้ อีเมลบนเซิร์ฟเวอร์ ความแตกต่างระหว่างโปรโตคอล IMAP และ POP คือต้องใช้โปรโตคอล POP หน่วยความจำเพิ่มเติมเพื่อจัดเก็บข้อมูล และโปรโตคอล IMAP จะเข้าถึงเซิร์ฟเวอร์แทนเครื่องไคลเอ็นต์ IMAP4 ถูกสร้างขึ้นเพื่อแทนที่ POP3 แต่ POP3 ยังคงเป็นมาตรฐานที่ใช้กันอย่างแพร่หลายจนถึงทุกวันนี้

TIdIRCเซิร์ฟเวอร์

ส่วนประกอบเซิร์ฟเวอร์ที่ออกแบบมาเพื่อรองรับการดำเนินการบริการที่ใช้บ่อยที่สุดบนอินเทอร์เน็ต หรือที่เรียกกันทั่วไปว่าแชท ส่วนประกอบให้พื้นฐาน การก่อสร้างตึกสำหรับเซิร์ฟเวอร์ IRC (Internet Relay Chat)

TIdMappedPortTCP

ส่วนประกอบเซิร์ฟเวอร์ที่ออกแบบมาเพื่อสร้างพอร์ตที่แมป ซึ่งมักใช้ในพร็อกซีเซิร์ฟเวอร์ วิธีการของส่วนประกอบนี้ช่วยให้คุณสามารถแมปพอร์ตหนึ่งไปยังอีกพอร์ตหนึ่งได้ ตัวอย่างเช่น พอร์ต 80 สามารถแมปกับพอร์ต 3000 ได้ และคำขอทั้งหมดไปยังพอร์ตแรก (พอร์ต 80) จะถูกส่งต่อไปยังพอร์ตที่สอง (พอร์ต 3000)

TIdNNTP และ TIdNNTPServer

ส่วนประกอบเหล่านี้จำเป็นเพื่อรองรับ Network News Transfer Protocol (NNTP) ที่ใช้ในบริการข่าว คอมโพเนนต์ไคลเอ็นต์ประกอบด้วยการสนับสนุนสำหรับการเข้ารหัสและถอดรหัส MIME ตลอดจนการสนับสนุนอักขระหลายไบต์และการเข้ารหัสสำรอง ส่วนประกอบเซิร์ฟเวอร์ช่วยให้คุณสร้างเซิร์ฟเวอร์ข่าวได้ สิ่งสำคัญคือต้องทราบว่า TIdNNTPServer ไม่ใช่เซิร์ฟเวอร์ข่าวที่มีคุณสมบัติครบถ้วน แต่เป็นส่วนประกอบที่ให้ฟังก์ชันพื้นฐานสำหรับเซิร์ฟเวอร์ดังกล่าว

TIdQOTD และ TIdQOTDServer

ส่วนประกอบต่างๆ ใช้เพื่อให้บริการใบเสนอราคาประจำวัน ส่วนประกอบไคลเอนต์เชื่อมต่อกับอินสแตนซ์ส่วนประกอบเซิร์ฟเวอร์เพื่อรับใบเสนอราคารายวัน แต่ละอินสแตนซ์ของเซิร์ฟเวอร์มีฐานข้อมูลการอ้างอิงที่ไม่ซ้ำกัน

คอมโพเนนต์ไคลเอ็นต์ที่ออกแบบมาเพื่อใช้ในแอปพลิเคชัน Simple Mail Transfer Protocol (SMTP) ซึ่งให้การสนับสนุนการตรวจสอบสิทธิ์ การเข้ารหัสและถอดรหัส MIME และการสนับสนุนอักขระแบบหลายไบต์

ส่วนประกอบไคลเอนต์ที่ออกแบบมาเพื่อให้บริการ SNTP (Simple Network Time Protocol) - บริการเวลา สามารถใช้เชื่อมต่อกับบริการได้ตลอดเวลาเพื่อตรวจสอบ วันที่ปัจจุบันและเวลา

TIdSimpleServer

ส่วนประกอบเซิร์ฟเวอร์ที่ให้เซิร์ฟเวอร์ TCP แบบน้ำหนักเบา ช่วยให้คุณสามารถจัดระเบียบการเชื่อมต่อแบบจุดต่อจุด ใช้เพื่อสร้างเซิร์ฟเวอร์ที่มีผู้ใช้รายเดียว กล่าวคือ สามารถให้บริการได้ครั้งละหนึ่งการเชื่อมต่อเท่านั้น ต่างจากคอมโพเนนต์ TIdTCPServer ตรงที่จะไม่เกิดกระบวนการรองเมื่อรอคำขอจากไคลเอ็นต์และเมื่อประมวลผลคำขอเหล่านี้ กล่าวอีกนัยหนึ่ง หากเซิร์ฟเวอร์ให้บริการคำขอจากไคลเอนต์ และในขณะนั้นไคลเอนต์อื่นกำลังติดต่อเซิร์ฟเวอร์เพื่อเชื่อมต่อ เซิร์ฟเวอร์นั้นจะถูกบล็อกจนกระทั่งสิ้นสุดการประมวลผลคำขอแรก

TIdTelnet และ TIdTelnetServer

ส่วนประกอบไคลเอ็นต์ใช้เพื่อจัดระเบียบเซสชันระยะไกลบนคอมพิวเตอร์เครื่องอื่น รวมถึงการเจรจาคอนโซลและการรับรองความถูกต้อง โปรโตคอลการสื่อสารถือว่ามีบุคคลที่โต้ตอบแบบโต้ตอบกับเซิร์ฟเวอร์ ส่วนประกอบไคลเอนต์ไม่มีการรองรับการแสดงผลหรือการจำลองเทอร์มินัล แต่เพียงให้การเชื่อมต่อกับส่วนของเซิร์ฟเวอร์ โดยทั่วไปแล้ว โปรโตคอลเซิร์ฟเวอร์ TIdTelnetServer ใช้เพื่อจัดระเบียบฐานข้อมูลระยะไกลด้วยอินเทอร์เฟซข้อความสำหรับการโต้ตอบแบบโต้ตอบกับไคลเอนต์

TIdTime และ TIdTimeServer

คอมโพเนนต์ไคลเอ็นต์เป็นทางเลือกแทนคอมโพเนนต์ TIdSNTP เพื่อกำหนดเวลา สิ่งสำคัญคือต้องทราบว่ารูปแบบของโปรโตคอลทั้งสองนั้นแตกต่างกัน TIdTime ขึ้นอยู่กับรูปแบบ RFC 868 (ส่งคืนเวลาในมาตรฐาน UNIX OS ภายใน โดยดำเนินการแปลงที่จำเป็นทั้งหมด) ส่วนประกอบเซิร์ฟเวอร์มีความคล้ายคลึงในการทำงานกับเซิร์ฟเวอร์ DayTime สามารถใช้เพื่อใช้บริการเวลาได้ คอมพิวเตอร์ท้องถิ่น. ไม่จำเป็นต้องมีรหัสเพิ่มเติม เพียงสร้างอินสแตนซ์ของ TIdTimeServer ที่จะส่งคืนเวลาของนาฬิกาภายในของคอมพิวเตอร์เซิร์ฟเวอร์

TIdTrivialFTP และ TIdTrivialFTPServer

ส่วนประกอบเหล่านี้จำเป็นต่อการจัดระเบียบโปรโตคอลการถ่ายโอนไฟล์อย่างง่าย ส่วนประกอบไคลเอ็นต์ของโปรโตคอลนี้ใช้เพื่อเชื่อมต่อกับอินสแตนซ์ของส่วนประกอบเซิร์ฟเวอร์ที่เกี่ยวข้อง โปรโตคอลนี้มีไว้สำหรับการถ่ายโอนไฟล์แบบส่วนตัวและน้ำหนักเบา เช่น ในเครือข่ายท้องถิ่นหรือสำหรับการโหลด (อัปโหลด) ตารางเส้นทางไปยังเราเตอร์ เนื่องจากคุณลักษณะที่อ่อนแอของโปรโตคอลนี้ จึงไม่แนะนำให้ใช้เมื่อใช้อัลกอริธึมการรับรองความถูกต้องหรือกลไกความปลอดภัยอื่น ๆ วัตถุประสงค์หลักของโปรโตคอลนี้คือเพื่อถ่ายโอนไฟล์ไปยังอุปกรณ์ฮาร์ดแวร์เพื่อวัตถุประสงค์ในการแก้ไข

TIdTunnelMaster และ TIdTunnelSlave

ส่วนประกอบช่องสัญญาณเซิร์ฟเวอร์ใช้ในพร็อกซีเซิร์ฟเวอร์เพื่อจัดระเบียบการเชื่อมต่อแบบลอจิคัลหลายรายการบนฟิสิคัลเดียว (ช่องสัญญาณ) คลาสเหล่านี้สามารถใช้เพื่อวัตถุประสงค์ต่างๆ เช่น เพื่อจัดระเบียบการเชื่อมต่อที่เป็นความลับผ่านช่องทางที่ไม่เป็นความลับ

TIdWhois และ TIdWhoIsServer

ส่วนประกอบไคลเอนต์นี้เชื่อมต่อกับเซิร์ฟเวอร์ Whois มาตรฐานใด ๆ ทำให้คุณได้รับข้อมูลเกี่ยวกับโดเมน ส่วนประกอบเซิร์ฟเวอร์มีฟังก์ชันพื้นฐานของเซิร์ฟเวอร์ NIC

อินดี้ อื่นๆ

หน้าจานสี Indy Miscellaneous Components ประกอบด้วย BASE64, UUE, Quoted Printable และรูปแบบการสื่อสารทางอีเมลทั่วไปอื่นๆ ตัวเข้ารหัส (MD2, MD4 และ MD5) สำหรับมาตรฐานการเข้ารหัสที่ใช้ในการจัดเก็บรหัสผ่านและ ลายเซ็นอิเล็กทรอนิกส์ในรูปแบบที่ไม่สามารถย้อนกลับได้ (ถอดรหัสยาก) รวมถึงส่วนประกอบและยูทิลิตี้ที่มีประโยชน์อื่น ๆ อีกมากมายที่มักใช้ในการพัฒนาแอปพลิเคชันอินเทอร์เน็ต

TIdAntiFreeze

เนื่องจากอัลกอริธึมแบบบล็อกของส่วนประกอบ Indy จึงมักปรากฏว่าแอปพลิเคชันค้างในขณะที่การเชื่อมต่อกำลังทำงาน เพื่อลดการใช้กระบวนการรอง (เธรด) เมื่อจัดระเบียบการสื่อสารเพื่อป้องกันไม่ให้แอปพลิเคชันค้างก็เพียงพอที่จะวางส่วนประกอบที่ระบุลงในแบบฟอร์ม

ส่วนประกอบทำงานโดยแยกวิเคราะห์คำขอจากสแต็กโปรโตคอล TCP/IP และส่งข้อความไปยังแอปพลิเคชันในระหว่างความล่าช้าเมื่อการเชื่อมต่อภายนอกถูกบล็อก ซึ่งสร้างภาพลวงตาของการเรียกใช้โค้ด เนื่องจากส่วนประกอบส่งผลต่อการเชื่อมต่อที่ถูกบล็อกสำหรับกระบวนการหลักเท่านั้น จึงไม่จำเป็นต้องใช้ TIdAntiFreeze ในกระบวนการรองของแอปพลิเคชัน โปรดทราบว่าคอมโพเนนต์ TIdAntiFreeze ทำให้การเชื่อมต่อช้าลงเนื่องจากกระบวนการหลักถูกขัดจังหวะเป็นระยะๆ ในการประมวลผลข้อความ เป็นไปตามนั้นจะต้องได้รับการดูแลเพื่อให้แน่ใจว่าแอปพลิเคชันที่กำลังพัฒนาไม่ได้ใช้เวลาประมวลผลข้อความมากเกินไป รวมถึง OnClick, OnPaint, OnResize ฯลฯ สามารถควบคุมได้ผ่านคุณสมบัติของคลาส TIdAntiFreeze ในระดับหนึ่ง การใช้ส่วนประกอบนี้ไม่ได้บังคับ แต่ช่วยให้คุณสามารถแก้ปัญหาการซิงโครไนซ์การเชื่อมต่อกับส่วนต่อประสานภาพของแอปพลิเคชัน

TIdDateTimeStamp

คลาสสำหรับการคำนวณวันที่และเวลาที่เกี่ยวข้องกับข้อเท็จจริงที่ว่าอินเทอร์เน็ตโปรโตคอลใช้รูปแบบวันที่และเวลาที่แตกต่างกัน นอกจากนี้ ไคลเอนต์และเซิร์ฟเวอร์อาจอยู่ในโซนเวลาที่แตกต่างกัน

TIdIPWatch

เป็นส่วนประกอบแบบจับเวลาซึ่งจะคอยติดตามการเปลี่ยนแปลงที่อยู่ IP ของคอมพิวเตอร์อย่างต่อเนื่อง เหตุการณ์คอมโพเนนต์เกิดขึ้นเมื่อตรวจพบการเปลี่ยนแปลง โดยปกติส่วนประกอบนี้ใช้เพื่อตรวจสอบว่าคอมพิวเตอร์เชื่อมต่อกับอินเทอร์เน็ตหรือเครือข่ายอื่นหรือไม่ การเปลี่ยนแปลงที่อยู่ IP ในสถานการณ์นี้อาจเกิดขึ้นเนื่องจากที่อยู่ IP ถูกกำหนดโดยเซิร์ฟเวอร์ DHCP (Dynamic Host Configuration Protocol) เมื่อเชื่อมต่อกับเครือข่ายใหม่

TIdLogDebug

วัตถุประสงค์ขององค์ประกอบนี้คือเพื่อสกัดกั้นเหตุการณ์ของไคลเอนต์หรือส่วนประกอบเซิร์ฟเวอร์ใด ๆ และวางบันทึกของเหตุการณ์ไว้ ไฟล์ที่ระบุ. ส่วนประกอบนี้มีประโยชน์มากสำหรับการดีบักส่วนประกอบ Indy

TIdMessage

ส่วนประกอบนี้จะใช้ร่วมกับส่วนประกอบอื่นๆ เพื่อถอดรหัสหรือเข้ารหัสข้อความอย่างเหมาะสม สิ่งเหล่านี้อาจเป็นส่วนประกอบ POP, SMTP และ NNTP คลาสรองรับการเข้ารหัสและถอดรหัส MIME อักขระหลายไบต์ และการเข้ารหัส ISO

TIdNetworkCalculator

หนึ่งในส่วนประกอบ Indy ไม่กี่ชิ้นที่สามารถใช้ในการสร้างแอปพลิเคชันได้ เครื่องคำนวณเครือข่ายสามารถใช้เพื่อคำนวณที่อยู่ IP รวมถึงเน็ตเวิร์กมาสก์ ซับเน็ต คลาสเครือข่าย ฯลฯ

TIdThreadMgrDefault

ส่วนประกอบให้การควบคุมกระบวนการรองตามค่าเริ่มต้น สร้างขึ้นเมื่อองค์ประกอบ Indy ใดๆ ที่สนับสนุนการจัดการกระบวนการไม่มีอินสแตนซ์ของคลาส TIdThreadManager ที่กำหนดไว้ ส่วนประกอบมีความสามารถพื้นฐานสำหรับการจัดการกระบวนการรองเท่านั้น: การสร้างและทำลายกระบวนการเหล่านี้ตามความต้องการ

TIdThreadMgrPool

ส่วนประกอบการจัดการกระบวนการขั้นสูงกว่า TIdThreadMgrDefault เนื่องจากจะผสานกระบวนการต่างๆ แทนที่จะสร้างหรือทำลายกระบวนการเหล่านั้นตามความต้องการ

TIdVCard

VCard เทียบเท่ากับนามบัตรทางอิเล็กทรอนิกส์ และอาจมีข้อมูลส่วนบุคคลและข้อมูลกราฟิกของเจ้าของ

TIdIMFDecoder

ออกแบบมาเพื่อถอดรหัสข้อความอินเทอร์เน็ต มันเป็นลูกหลานของคลาส TIdCoder เช่นเดียวกับส่วนประกอบตัวเข้ารหัสอื่นๆ ทั้งหมด คลาส TIdCoder ถอดรหัสตามมาตรฐานรูปแบบข้อความอินเทอร์เน็ต ARPA RFS-822 ที่เสนอในเดือนสิงหาคม พ.ศ. 2525 และมาตรฐานการส่งข้อความ USENET RFC 1036 ที่เสนอในเดือนธันวาคม พ.ศ. 2530

ส่วนประกอบจะขยายคลาส TIdCoder เพื่อให้สามารถตรวจจับรูปแบบ RFS-822 ตามบริบทของส่วนหัว โดยมีโหมดถอดรหัสเมื่อรับและการเข้ารหัสและการถอดรหัส MIME คอมโพเนนต์ TIdIMFDecoder ใช้ในคลาส TIdMessageClient เพื่อถอดรหัสข้อความที่ได้รับและส่งข้อความ

TIdQuotedPrintableEncoder

QuotedPrintableEncoder ช่วยให้คุณสามารถถอดรหัสข้อความในรูปแบบที่ระบุ สามารถทำหน้าที่เป็นองค์ประกอบแบบสแตนด์อโลนที่มีประเภทการเข้ารหัสที่ระบุ ทำให้สามารถส่งข้อความที่มีประเภทการเข้ารหัสใหม่ได้

TIdBase64ตัวเข้ารหัส

ใช้อัลกอริธึมการเข้ารหัสอื่นที่ทำให้สามารถส่งอักขระที่ไม่สามารถพิมพ์ได้

TIdUUตัวเข้ารหัส

ใช้หนึ่งในอัลกอริธึมการเข้ารหัสแรกๆ การเข้ารหัส UU บางครั้งใช้เมื่อส่งบทความไปยังบริการข่าว

TIdXXEncoder

วิธีการเข้ารหัสนี้ไม่น่าจะถูกนำมาใช้เลย โดยพื้นฐานแล้ว นี่คือการเข้ารหัส UU เดียวกัน แต่มีตารางการเข้ารหัสที่แตกต่างกัน

TIdCoderMD2

ส่วนประกอบที่มีอัลกอริธึมการเข้ารหัส MD (Message Digest) ประเภทต่างๆ ทั้งหมดเป็นแบบสับเปลี่ยนทางเดียว และไม่มีอัลกอริธึมการถอดรหัส

ส่วนประกอบของไคลเอ็นต์โปรโตคอลและเซิร์ฟเวอร์สามารถใช้ในการพัฒนาเซิร์ฟเวอร์และแอปพลิเคชันอินเทอร์เน็ตไคลเอ็นต์ ร่วมกับหรือแทนแอปพลิเคชันพื้นฐาน (ClientSocket, ServerSocket) และส่วนประกอบอื่นๆ จากอินเทอร์เน็ตและจานสี Fastnet ส่วนประกอบ Indy ไม่ได้ใช้สถาปัตยกรรม WebBroker ซึ่งใช้การสนับสนุนระดับต่ำสำหรับอินเทอร์เน็ตโปรโตคอลและบริการโดยตรงในซอร์สโค้ด ( ซอร์สโค้ดแนบมาด้วย)

TIdConnectionInterceptOpenSSL และ TIdServerInterceptOpenSSL

โปรโตคอล SSL - Secure Sockets Layer ซึ่งรับประกันความลับและความน่าเชื่อถือของการสื่อสารระหว่างสองแอปพลิเคชันนั้นมีสองชั้น ที่ระดับต่ำของโปรโตคอลการขนส่งหลายชั้น (เช่น TCP) SSL เป็นโปรโตคอลการบันทึกและใช้เพื่อห่อหุ้มโปรโตคอลระดับสูงกว่าต่างๆ ข้อดีของ SSL ก็คือเป็นโปรโตคอลแอปพลิเคชันอิสระ แต่สามารถใช้โปรโตคอลระดับสูงกว่าบน SSL ได้

SSL ให้ความปลอดภัยในการสื่อสารซึ่งมีสามหน้าที่หลัก: ให้การเชื่อมต่อที่เป็นความลับ; การเข้ารหัสด้วย กุญแจสาธารณะ(ใช้เพื่อยืนยันความถูกต้องของผู้รับ) รองรับความน่าเชื่อถือในการส่งข้อมูล

  • การเข้ารหัสแบบสมมาตรใช้ในการเข้ารหัสข้อมูล (เช่น DES, RC4 เป็นต้น)
  • ลายเซ็นดิจิทัลมีให้โดยใช้การเข้ารหัสคีย์สาธารณะแบบอสมมาตร (เช่น RSA, DSS เป็นต้น)
  • ความน่าเชื่อถือของการสื่อสาร การส่งข้อความรวมถึงการตรวจสอบความสมบูรณ์ของข้อความผ่านรหัสแก้ไข MAC ฟังก์ชันแฮชที่ปลอดภัย (เช่น SHA, MD5 ฯลฯ) โดยใช้การคำนวณ MAC

เมื่อรวมกับ HTTP และการรับรองความถูกต้องของเซิร์ฟเวอร์ SSL จะมอบให้ ฟังก์ชั่นที่จำเป็นการเข้ารหัสและรักษาการเชื่อมต่อที่สร้างไว้เพิ่มเติม ตรวจสอบความถูกต้องของเว็บเซิร์ฟเวอร์อีกครั้ง ฯลฯ สิ่งสำคัญคือต้องเข้าใจว่า SSL ปกป้องการสื่อสารระหว่างการถ่ายโอนข้อมูลเท่านั้น และไม่ได้แทนที่กลไกความปลอดภัยอื่นๆ

คอมโพเนนต์ TIdConnectionInterceptOpenSSL และ TIdServerInterceptOpenSSL ให้การเชื่อมต่อทั้งฝั่งไคลเอ็นต์และฝั่งเซิร์ฟเวอร์โดยใช้โปรโตคอล SSL ควรสังเกตว่าส่วนประกอบ TIdConnectionInterceptOpenSSL และ TIdServerInterceptOpenSSL มีเฉพาะใน Delphi 6 เท่านั้นและไม่มีใน Kylix นี่เป็นเพราะความซับซ้อนของโปรโตคอลซึ่งในกรณีของการใช้งาน Windows นั้นจะขึ้นอยู่กับฟังก์ชั่นของระบบปฏิบัติการ

ตัวอย่างของการใช้ส่วนประกอบ Indy สามารถพบได้ในไดเร็กทอรี /Delphi6/Demos/Indy โดยรวมแล้วไลบรารี Indy ในเวอร์ชัน 8.0 มีส่วนประกอบ 69 รายการ มีการระบุว่าในเวอร์ชัน 9.0 ไลบรารีที่ระบุจะมีส่วนประกอบ 86 รายการ ส่วนประกอบทั้งหมดได้รับการรวมเป็นหนึ่งเดียวและรวมอยู่ในทั้ง Delphi 6 และ Kylix ซึ่งช่วยให้สามารถใช้ในการพัฒนาแอปพลิเคชันข้ามแพลตฟอร์มได้ ส่วนประกอบ Indy ทั้งหมดรองรับมัลติเธรด

ส่วนประกอบ Indy ใช้ฟังก์ชันการทำงานเกือบทั้งหมดที่พบในอินเทอร์เน็ตและส่วนประกอบ Fastnet ดังที่แสดงไว้อย่างชัดเจนในตาราง

Fastn และส่วนประกอบ ส่วนประกอบอินดี้ วัตถุประสงค์ของส่วนประกอบ
1 TserverSocket, TClientSocket TIdTCPserverSocket, TIdTCPClientSocket ปฏิสัมพันธ์ระหว่างคอมพิวเตอร์สองเครื่อง (ไคลเอนต์และเซิร์ฟเวอร์) โดยใช้โปรโตคอล TCP/IP
2 TNMDayTime TIdDayTime, TIdDayTimeServer สอบถามเซิร์ฟเวอร์สำหรับเวลาปัจจุบัน
3 TNMEcho TIdEcho, TIdEchoServer ใช้เพื่อสื่อสารกับเซิร์ฟเวอร์ตอบกลับ
4 TNMFinger TIdFinger, TIdFingerServer ใช้เพื่อรับข้อมูลเกี่ยวกับผู้ใช้จากเซิร์ฟเวอร์การค้นหาทางอินเทอร์เน็ต
5 TNMFTP TIdFTP, TIdTrivialFTP, TIdTrivialFTPServer ให้การถ่ายโอนไฟล์โดยใช้โปรโตคอล FTP
6 TNMHTTP TIdHTTP, TIdHTTPเซิร์ฟเวอร์ ใช้โปรโตคอล HTTP สำหรับการแลกเปลี่ยนข้อมูล
7 TNMMsgServ, TNMMsg ใช้เพื่อส่งข้อความตัวอักษรธรรมดาจากไคลเอนต์ไปยังเซิร์ฟเวอร์
8 TNMNNTP TIdNNTP, TIdNNTPเซิร์ฟเวอร์ รองรับการแลกเปลี่ยนข้อมูลกับเซิร์ฟเวอร์ข่าว
9 TNMPOP3 TIdPOP3 ใช้เพื่อรับอีเมลจากเมลเซิร์ฟเวอร์โดยใช้โปรโตคอล POP3
10 TNMSMTP TIdSMTP ใช้ในการส่งอีเมลผ่านเซิร์ฟเวอร์จดหมายอินเทอร์เน็ต
11 TNMStrm, TNMStrmServ ส่งข้อมูลไบนารีที่เขียนไปยังสตรีมโดยใช้โปรโตคอล TCP/IP
12 TNMUDP TIdUDP, TIdUDPเซิร์ฟเวอร์ ถ่ายโอนข้อมูลโดยใช้โปรโตคอล UDP
13 TpowerSock, TNMเซิร์ฟเวอร์ทั่วไป คลาสที่ห่อหุ้มส่วนประกอบที่เป็นพื้นฐานสำหรับการเขียนไคลเอนต์ของคุณเอง (Powersock) และเซิร์ฟเวอร์ (NMGeneralServer)
14 TNMUUตัวประมวลผล TIdUUEncoder, TIdUUDecoder ดำเนินการบันทึก ไฟล์ไบนารีเป็นรูปแบบ MIME หรือ UUENCODE
15 TNMURL แปลงสตริงเป็น รูปแบบ HTMLและทำการบันทึกแบบย้อนกลับ

ข้อยกเว้นคือคลาสต่างๆ เช่น TNMMsgServ, TNMMsg, TNMStrm, TNMStrmServ, TpowerSock, TNMGeneralServer, TNMURL ซึ่งใช้โปรโตคอลที่ล้าสมัยหรือมีการใช้งานฟังก์ชันการทำงานในกลุ่มคลาสทางเลือกขนาดใหญ่

อย่างไรก็ตาม แตกต่างจากรุ่นก่อนๆ นั่นคือส่วนประกอบอินเทอร์เน็ตและ Fastnet Indy มีส่วนประกอบเซิร์ฟเวอร์ที่สมบูรณ์ยิ่งขึ้นและส่วนประกอบสำหรับการแปลงรหัสและการเข้ารหัสข้อมูล รวมถึงการสนับสนุนการตรวจสอบสิทธิ์ (Indy Misc palette) ดังที่เห็นได้จากตารางด้านบน โปรโตคอลและบริการหลักไม่ได้จัดทำโดยไคลเอนต์เท่านั้น แต่ยังรวมถึงส่วนประกอบของเซิร์ฟเวอร์ด้วย บริการเหล่านี้คือบริการเวลา บริการตอบสนอง การรับข้อมูลผู้ใช้ รวมถึงโปรโตคอล HTTP, NNTP, UDP และแม้แต่ FTP เวอร์ชันที่ง่ายที่สุด

ตัวอย่างการใช้ส่วนประกอบ Indy

ในส่วนประกอบ Indy ที่มีอยู่ใน Delphi ที่อยู่ IP จะถูกกำหนดไว้ในคุณสมบัติ Host ซึ่งโดยทั่วไปจะมีเฉพาะในแอปพลิเคชันไคลเอนต์เท่านั้น ส่วนประกอบที่โฮสต์บนเซิร์ฟเวอร์มีวิธีการที่ช่วยให้คุณสามารถเริ่มหรือหยุดการสำรวจพอร์ตที่เกี่ยวข้องได้ ตัวอย่างเช่น การเปลี่ยนคุณสมบัติ Active ของส่วนประกอบ IdTCPServer จะเริ่มต้นหรือหยุดการสำรวจพอร์ตที่เกี่ยวข้อง เมื่อสร้างการเชื่อมต่อระหว่างไคลเอนต์และเซิร์ฟเวอร์แล้ว การถ่ายโอนข้อมูลจึงสามารถเริ่มต้นได้

ส่วนประกอบ Indy ให้ความสำคัญกับความปลอดภัยและความน่าเชื่อถือเป็นอย่างมากเมื่อทำงานกับข้อมูล ตัวอย่างเช่น ส่วนประกอบ IdTCPClient มีวิธีการเชื่อมต่อและตัดการเชื่อมต่อ การใช้เทคนิคการเขียนโปรแกรมเช่นโค้ดด้านล่างจากฝั่งไคลเอ็นต์:

ด้วย TCPClient ให้เริ่มการเชื่อมต่อ; ลอง lstMain.Items.Add(ReadLn); ในที่สุดก็ตัดการเชื่อมต่อ; จบ; จบ;

และใช้คุณสมบัติการเชื่อมต่อที่ส่งผ่านเป็นพารามิเตอร์ไปยังอินสแตนซ์ AThread ของคลาส TIdPeerThread จากฝั่งเซิร์ฟเวอร์:

ด้วย AThread.Connection ให้เริ่มต้น WriteLn("Hello from Basic Indy Server server"); ตัดการเชื่อมต่อ; จบ;

คุณสามารถวางใจได้ในการดำเนินการเชื่อมต่อตามปกติหรือการจัดการข้อผิดพลาดที่ถูกต้อง

สังเกตเมธอด ReadLn และ WriteLn ของคลาสที่เกี่ยวข้อง ซึ่งคล้ายกับคำสั่ง Pascal I/O มาตรฐาน นี่เป็นการยกย่องเทคนิคการเขียนโปรแกรม UNIX ซึ่งการทำงานของระบบส่วนใหญ่ดำเนินการโดยการอ่านและเขียนลงในไฟล์ที่เกี่ยวข้อง

เช่นเดียวกับส่วนประกอบ Fastnet คลาสองค์ประกอบ Indy มีเหตุการณ์ที่สามารถใช้เพื่อจัดเตรียมการจัดการเหตุการณ์ได้ ตัวอย่างเช่น คุณสามารถจัดเรียงข้อความให้แสดงบนแบบฟอร์มเมื่อเชื่อมต่อกับไคลเอนต์:

ขั้นตอน TForm1.IdECHOServer1Connect (AThread: TIdPeerThread); start lblStatus.caption:= "[ ให้บริการลูกค้า ]"; จบ;

Indy จัดเตรียมส่วนประกอบที่ใช้โปรโตคอลกับส่วนของไคลเอนต์และเซิร์ฟเวอร์ที่เป็นเอกลักษณ์ของไลบรารีนี้ ส่วนประกอบ TIdGopherServer และ TIdGopher ต้องขอบคุณเมธอด GetExtensedMenu, GetFile, GetMenu, GetTextFile บนฝั่งไคลเอ็นต์และ ReturnGopherItem, SendDirectoryEntry บนฝั่งเซิร์ฟเวอร์ ช่วยในการดูไฟล์ หลากหลายชนิดรวมถึงรายการที่ทำเครื่องหมายว่าซ่อนอยู่ เช่นเดียวกับไดเรกทอรีบน คอมพิวเตอร์ระยะไกล(คล้ายกับสิ่งที่คำสั่ง dir *.* ทำ ระบบปฏิบัติการเอ็มเอส-ดอส)

การใช้คอมโพเนนต์ IdSMTP และ IdMessage คุณสามารถสร้างเว็บแอปพลิเคชันของคุณเองที่สามารถส่งอีเมลโดยใช้โปรโตคอล SMTP ได้อย่างง่ายดาย

ในกรณีนี้ คลาส IdMessage (หนึ่งใน 23 คอมโพเนนต์จากหน้า Indy Misc) มีหน้าที่สร้างข้อความซึ่งตามมาจากชื่อ และ IdSMTP ใช้สำหรับจัดระเบียบการเชื่อมต่อกับเซิร์ฟเวอร์เมล

เทคโนโลยีที่ใช้ใน Indy ใช้การล็อกการอ่านและเขียน การดำเนินการเชื่อมต่อใดๆ ที่ใช้ใน Indy จะรอให้การเชื่อมต่อเสร็จสิ้น เมื่อทำงานกับส่วนประกอบไคลเอนต์ Indy โดยทั่วไปคุณจะต้องทำสิ่งต่อไปนี้:

  • ขอเชื่อมต่อกับเซิร์ฟเวอร์
  • ส่งคำขออ่านและเขียนไปยังเซิร์ฟเวอร์ (ขึ้นอยู่กับประเภทของเซิร์ฟเวอร์ ขั้นตอนจะดำเนินการครั้งเดียวหรือทำซ้ำหลายครั้ง)
  • ยุติการเชื่อมต่อกับเซิร์ฟเวอร์และตัดการเชื่อมต่อ

ส่วนประกอบ Indy ได้รับการออกแบบมาเพื่อมอบความเป็นนามธรรมในระดับสูงเป็นพิเศษ รายละเอียดปลีกย่อยและรายละเอียดของสแต็ก TCP/IP ถูกซ่อนไม่ให้โปรแกรมเมอร์ เพื่อให้เขาสามารถมุ่งความสนใจไปที่งานที่ทำอยู่ได้

ตัวอย่างเล็กๆ ต่อไปนี้แสดงเซสชัน bean ไคลเอนต์ทั่วไป:

ด้วย IndyClient ให้เริ่มต้น Host:= "zip.pbe.com"; // โฮสต์เรียกพอร์ต:= 6000; // พอร์ตเพื่อเรียกเซิร์ฟเวอร์บน Connect; ลอง // รหัสของคุณอยู่ที่นี่ในที่สุด ตัดการเชื่อมต่อ; จบ; จบ;

ในตัวอย่างนี้ แม้ว่าการเชื่อมต่อกับเซิร์ฟเวอร์จะไม่ได้ถูกสร้างขึ้น การเชื่อมต่อจะสิ้นสุดลงอย่างสวยงามเนื่องจากการใช้คำสั่ง try-finally

ส่วนประกอบเซิร์ฟเวอร์ของ Indy อธิบายเซิร์ฟเวอร์รุ่นต่างๆ มากมายที่สามารถใช้ได้ ขึ้นอยู่กับความต้องการและโปรโตคอลที่คุณใช้

TIdTCPServer เป็นส่วนประกอบเซิร์ฟเวอร์ที่ใช้บ่อยที่สุด ซึ่งสร้างกระบวนการรองที่ไม่ขึ้นกับกระบวนการแอปพลิเคชันหลัก กระบวนการที่สร้างขึ้นรอการร้องขอที่เข้ามาจาก ลูกค้าที่มีศักยภาพ. กระบวนการรองแต่ละกระบวนการถูกสร้างขึ้นสำหรับลูกค้าแต่ละรายที่มีการร้องขอที่ตอบสนอง เหตุการณ์ที่เกิดขึ้นในระหว่างกระบวนการบำรุงรักษาเกี่ยวข้องกับบริบทของกระบวนการที่เกี่ยวข้อง

กล่าวอีกนัยหนึ่ง สำหรับการเชื่อมต่อไคลเอ็นต์แต่ละครั้ง คลาส TIdTCPServer ใช้เธรดรองที่ไม่ซ้ำกันโดยการเรียกตัวจัดการเหตุการณ์ OnExecute ของเธรดนั้น พารามิเตอร์อย่างเป็นทางการของเมธอด OnExecute คือการอ้างอิงถึงอินสแตนซ์ของคลาส Athread ที่สอดคล้องกับเธรดที่สร้างขึ้น คุณสมบัติการเชื่อมต่อของคลาสนี้คือการอ้างอิงถึงคลาส TIdTCPConnection ซึ่งเป็นอินสแตนซ์ที่ถูกสร้างขึ้นเพื่อประมวลผลคำขอของไคลเอ็นต์ TIdTCPConnection รองรับการอ่านและเขียนผ่านการเชื่อมต่อ รวมถึงการสร้างและยุติเซสชันการสื่อสาร

โปรโตคอล UDP ทำงานโดยไม่ต้องสร้างการเชื่อมต่อกับเซิร์ฟเวอร์ก่อน (แต่ละแพ็กเก็ตที่ส่งเป็นชุดข้อมูลอิสระ และไม่ได้เป็นส่วนหนึ่งของเซสชันหรือการเชื่อมต่อที่ใหญ่กว่า) ในขณะที่ TIdTCPServer จะสร้างเธรดแยกกันสำหรับแต่ละการเชื่อมต่อ TIdUDPServer จะใช้เธรดหลักหรือเธรดรองเดี่ยวที่จัดการคำขอโปรโตคอล UDP ทั้งหมด เมื่อ TIdUDPServer ทำงานอยู่ เธรดจะถูกสร้างขึ้นเพื่อฟังแพ็กเก็ต UDP ที่เข้ามา สำหรับแต่ละแพ็กเก็ตที่ได้รับ เหตุการณ์ OnUDPRead จะถูกยกขึ้นบนเธรดหลักหรือในบริบทของเธรดการฟัง ขึ้นอยู่กับค่าของคุณสมบัติ ThreadedEvent เมื่อ ThreadedEvent ประเมินเป็น False เหตุการณ์จะเกิดขึ้นบนเธรดหลัก ไม่เช่นนั้นจะเกิดขึ้นบนเธรดที่กำลังฟัง ในขณะที่กำลังประมวลผลเหตุการณ์ การทำงานของเซิร์ฟเวอร์อื่นๆ จะถูกบล็อก ดังนั้นจึงเป็นสิ่งสำคัญเพื่อให้แน่ใจว่าขั้นตอน OnUDPRead ทำงานโดยเร็วที่สุด

หากคุณต้องการสร้างแอปพลิเคชันไคลเอนต์ใหม่สำหรับเซิร์ฟเวอร์ที่มีอยู่โดยใช้โปรโตคอลที่มีอยู่ งานของคุณคือการพัฒนาและแก้ไขข้อบกพร่องแอปพลิเคชันไคลเอนต์เท่านั้น แต่เมื่อคุณต้องพัฒนาทั้งลูกค้าและ แอปพลิเคชันเซิร์ฟเวอร์ไม่ว่าจะใช้โปรโตคอลที่มีอยู่หรือใหม่ เรากำลังเผชิญกับปัญหา "ไก่กับไข่" แบบคลาสสิก จะเริ่มเขียนโปรแกรมได้ที่ไหน - จากไคลเอนต์หรือจากเซิร์ฟเวอร์?

แน่นอนว่าทั้งไคลเอนต์และเซิร์ฟเวอร์จะต้องถูกสร้างขึ้นในที่สุด สำหรับแอปพลิเคชันจำนวนมาก โดยเฉพาะอย่างยิ่งที่ใช้โปรโตคอลแบบข้อความ (เช่น HTTP) การเริ่มสร้างแอปพลิเคชันโดยการออกแบบเซิร์ฟเวอร์จะง่ายกว่า และสำหรับการดีบักก็มีไคลเอนต์ที่สะดวกอยู่แล้ว นี่คือแอปพลิเคชันคอนโซล Telnet ที่พร้อมใช้งานทั้งบน Windows และ UNIX

หากคุณพิมพ์คอนโซล คำสั่งเทลเน็ต 127.0.0.1 80 ด้วยที่อยู่ IP ของคอมพิวเตอร์ในระบบและหมายเลขพอร์ต 80 ซึ่งใช้เป็นค่าเริ่มต้นโดยเว็บเซิร์ฟเวอร์ จากนั้นแอปพลิเคชันจะตอบสนองด้วยข้อความที่แสดงในรูปที่ 1 6 ในกรณีของระบบปฏิบัติการ Windows 2000 และ IIS 5.0

ในการสร้างเซิร์ฟเวอร์ที่ง่ายที่สุดโดยใช้ส่วนประกอบ Indy คุณต้องมี:

หากคุณต้องการออกแบบเซิร์ฟเวอร์ที่ไม่เพียงแต่จะแจ้งไคลเอ็นต์อย่างถูกต้องเมื่อการเชื่อมต่อขาดหายไป แต่ยังให้ข้อมูลเกี่ยวกับสถานการณ์ข้อผิดพลาดที่เกิดขึ้นด้วย ให้ใช้คำสั่ง try-ยกเว้น แทน try-finally - ตัวอย่างเช่น แสดงในตัวอย่างต่อไปนี้:

ขั้นตอน TDataModule1.IdTCPServer1Execute (AThread: IdPeerThread); var s: สตริง; เริ่มต้นด้วย AThread.Connection ลองลอง s:= ReadLn; // ดำเนินงานของเซิร์ฟเวอร์ที่นี่ // หากไม่มีข้อยกเว้นเกิดขึ้น // เขียนการตอบสนองของเซิร์ฟเวอร์ WriteLn(s) ยกเว้นบน e: ข้อยกเว้นจะเริ่มต้น WriteLn(e.Message); end; //on end; //ลองยกเว้นในที่สุด ตัดการเชื่อมต่อ สิ้นสุด สิ้นสุด;

ตัวอย่างเล็กๆ นี้สาธิตขั้นตอนในการสร้างเซิร์ฟเวอร์ข้อความแบบง่าย รวมถึงวิธีการแก้ไขข้อบกพร่อง

เซิร์ฟเวอร์ที่อธิบายไว้ข้างต้นเป็นตัวอย่างทั่วไปขององค์กรของการคำนวณแบบกระจายสมัยใหม่

คุณสมบัติของการสร้างแอปพลิเคชั่นหลายชั้น

เมื่อเร็ว ๆ นี้ มีการใช้งานเซิร์ฟเวอร์หลายเครื่องมากขึ้นเพื่อตอบสนองคำขอของลูกค้า เซิร์ฟเวอร์ประเภทนี้ เมื่อได้รับคำขอของลูกค้าและเตรียมบางส่วนสำหรับการประมวลผลเพิ่มเติม จะติดต่อกับเซิร์ฟเวอร์อื่นและส่งคำขอหรือคำขอที่แปลงแล้วไป เซิร์ฟเวอร์ชั้นสองสามารถสื่อสารกับเซิร์ฟเวอร์อื่นได้ ดังนั้นเราจึงสามารถพูดคุยเกี่ยวกับสถาปัตยกรรมเซิร์ฟเวอร์แบบหลายชั้นได้

ต่อไปเราจะสร้างเซิร์ฟเวอร์การเข้าถึงข้อมูลที่มีวัตถุประสงค์เพื่อส่งคืนข้อมูลจากฐานข้อมูล อย่างไรก็ตาม เซิร์ฟเวอร์นี้ไม่ได้อ่านหรือเขียนลงในไฟล์ฐานข้อมูลโดยตรง แต่จะสื่อสารกับเซิร์ฟเวอร์ฐานข้อมูลเพื่อค้นหาข้อมูลที่ลูกค้าต้องการแทน

ดังนั้นเราจึงเริ่มพัฒนาแอปพลิเคชันด้วยสถาปัตยกรรมสามระดับ ในการสร้างเซิร์ฟเวอร์ฐานข้อมูลโดยใช้ส่วนประกอบ Indy คุณต้องมี:

  1. สร้างโครงการใหม่
  2. วางบน แบบฟอร์มหลักอินสแตนซ์โครงการของคอมโพเนนต์ TIdTCPServer จากจานสี Indy Servers
  3. ตั้งค่าคุณสมบัติ DefaultPort ของอินสแตนซ์คลาส TIdTCPServer1 เป็น 6001 (ขอแนะนำให้กำหนดค่าขนาดใหญ่เพื่อหลีกเลี่ยงการทำซ้ำหมายเลขพอร์ตในแอปพลิเคชันต่างๆ) และตั้งค่าคุณสมบัติ Active เป็นจริง
  4. เพิ่มโมดูลใหม่ให้กับโปรเจ็กต์โดยเลือกไฟล์ | ใหม่ | โมดูลข้อมูล และวางอินสแตนซ์ของส่วนประกอบ SQLConnection และ SQLDataSet จากแท็บ dbExpress บนแผงส่วนประกอบ
  5. ตั้งค่าคุณสมบัติ ConnectionName ของคลาส SQLConnection เป็น IBLocal และ LoginPrompt เป็น False หากคุณไม่ได้กำหนดค่า IBLocal บนฐานข้อมูล Employee.gdb ให้ทำตามขั้นตอนนี้ก่อน

สวัสดีทุกคน!

เมื่อพัฒนาโครงการเว็บถัดไป งานก็เกิดขึ้น - ใช้งานซอฟต์แวร์ไคลเอนต์ใน Delphi ซึ่งจะถ่ายโอนข้อมูลไปยังเซิร์ฟเวอร์โดยใช้วิธี POST แอปพลิเคชันจะต้องส่งข้อความและอัปโหลดไฟล์ไปยังเว็บเซิร์ฟเวอร์

การดำเนินการส่งข้อมูลดังกล่าวโดยใช้ภาษาฝั่งเซิร์ฟเวอร์ การพัฒนาเว็บ(เช่น PHP) ค่อนข้างง่าย แต่ถ้าคุณต้องการเขียนซอฟต์แวร์แบบหลายผู้ใช้ตามแอปพลิเคชันที่โต้ตอบกับเซิร์ฟเวอร์ ก็จะซับซ้อนกว่าเล็กน้อย วิธีการเชื่อมต่อฐานข้อมูลโดยตรงและผ่าน FTP ไปยังเซิร์ฟเวอร์จาก Delphi นั้นไม่จำเป็นอีกต่อไปเพราะว่า ไม่ปลอดภัย ไม่น่าเชื่อถือ (การเปลี่ยนรหัสผ่าน ข้อมูลการเชื่อมต่อ ฯลฯ) และสร้างเพิ่มเติม ปัญหาความเข้ากันได้ของซอฟต์แวร์ในฝั่งไคลเอ็นต์ เพื่อแก้ไขปัญหา ฉันตัดสินใจเขียนสคริปต์ (ส่วนของเซิร์ฟเวอร์) ใน PHP ที่จะประมวลผลขาเข้า คำขอโพสต์และส่งคืนผลลัพธ์ให้กับลูกค้า (แอปพลิเคชัน Delphi) ข้อดีของแนวทางนี้คือการเชื่อมต่อและการประมวลผลข้อมูลทั้งหมดเกิดขึ้นบนเซิร์ฟเวอร์ ซึ่งปลอดภัยกว่า "การเชื่อมต่อ" โดยตรงมาก

เมื่อฉันเริ่มกูเกิ้ล มีข้อมูลที่กระจัดกระจายมากมายหายไป ส่วนใหญ่อยู่ในฟอรัม แต่ทั้งหมดก็แยกเป็นชิ้นๆ สิ่งหนึ่งที่แน่นอนคือจะใช้ Indy กล่าวคือส่วนประกอบ IdHTTP ที่ใช้วิธีการ POST ที่จริงแล้วทุกอย่างเรียบง่าย วิธีนี้รับพารามิเตอร์สองตัว Url ของทรัพยากรและ DataStream (สตรีมข้อมูล) และส่งคืนผลลัพธ์ในรูปแบบข้อความ (อาจเป็นโค้ด HTML ของเพจก็ได้) สิ่งสำคัญคือรูปแบบที่ถูกต้องของ DataStream (กระแสข้อมูลที่ส่ง) แต่ระหว่างทางก็มีข้อผิดพลาดเพิ่มเติมเกิดขึ้นนั่นคือการเข้ารหัสของรัสเซีย (ถ้าไม่ดี) นี่คือจุดเริ่มต้นของความสนุกจากการท่องอินเทอร์เน็ตเป็นเวลาหลายชั่วโมง โดยทั่วไปแล้ว เรามาพูดคุยกันมากพอแล้ว เรามาฝึกฝนและใช้งานซอฟต์แวร์กันดีกว่า

ดังนั้นโปรแกรมจึงง่าย เธอจะต้องส่งข้อมูลไปยังเซิร์ฟเวอร์โดยใช้วิธี POST ข้อมูลประกอบด้วย " หัวเรื่อง " (เส้น), " คำอธิบาย » ( ข้อความหลายบรรทัด) และ ไฟล์กราฟิก(jpg,png,gif-ข้อมูลไบนารี) เซิร์ฟเวอร์จะต้องยอมรับข้อมูลนี้ ประมวลผล บันทึกไฟล์กราฟิกบนเซิร์ฟเวอร์ และส่งคืนการตอบกลับ เพื่อเป็นการตอบสนอง เราจะส่งคืน Delphi ให้กับแอปพลิเคชัน ซึ่งเป็นข้อความเดียวกันกับป้ายกำกับที่เพิ่มและลิงก์ไปยังไฟล์ที่ดาวน์โหลด ไม่มีอะไรอีกแล้ว.

เริ่มต้นด้วยการใช้งานส่วนเซิร์ฟเวอร์ (คล้ายกับ API ของไซต์) เปิดอันใดอันหนึ่ง โปรแกรมแก้ไขข้อความ(แผ่นจดบันทึก) และเขียนโค้ดต่อไปนี้ลงไป:

"; ) อื่น ๆ ( echo "หัวข้อ: หายไป""
"; ) //ตรวจสอบข้อมูลขาเข้าว่ามีข้อมูลฟิลด์ "เนื้อหา" หรือไม่ ถ้า (!empty($_POST["content"]))( echo "Content: ".$_POST["content"]"
"; ) อื่น ๆ ( echo "เนื้อหา: หายไป""
"; ) //ตรวจสอบข้อมูลขาเข้าว่ามีไฟล์แนบอยู่หรือไม่ "file" if (!empty($_FILES["file"])) ( $finfo = pathinfo($_FILES["file"]["name" ]); / /รับข้อมูลเกี่ยวกับไฟล์ (ชื่อ นามสกุล ฯลฯ) //ตรวจสอบประเภทไฟล์ในรายการประเภทที่อนุญาต (การปรับปรุง:)) if (stripos("jpgpnggif",$finfo["extension"] )==0)( echo ">>>>>>>ประเภทไฟล์ไม่ถูกต้อง<<<<<<<<"; exit; //Если не допустим тип, полностью останавливаем скрипт } $fname = "files/" . "testimgfile." . $finfo["extension"]; //формируем путь и новое имя файла move_uploaded_file($_FILES["file"]["tmp_name"],$fname);//сохраняем временный файл "tmp_name" в файл $fname echo "http://".$_SERVER["HTTP_HOST"]."/".$fname; //возвращаем полный путь к файлу } ?>

บันทึก! เมื่อบันทึก (ผ่านแผ่นจดบันทึก) คุณต้องระบุการเข้ารหัส "UTF-8" มิฉะนั้นจะเกิดปัญหาในการแสดงอักษรซีริลลิก!

สคริปต์พยายามให้ความคิดเห็นโดยละเอียด คัดลอกสคริปต์นี้ไปยังเว็บเซิร์ฟเวอร์ของคุณ หากคุณยังไม่มี คุณสามารถใช้สคริปต์ของฉันสำหรับการทดสอบ โดยอยู่ที่: http://api..php

เค้าโครงใช้ส่วนประกอบต่อไปนี้: Label, Button (2 pcs.), Edit (2 pcs.), Memo (2 pcs.), CheckBox, OpenDialog, IdHTTP ตั้งชื่อส่วนประกอบดังต่อไปนี้ (คุณสมบัติ “ ชื่อ”):

  1. แก้ไขหัวข้อ) - ชื่อ=ชื่อเรื่อง;
  2. แก้ไข (เส้นทางไปยังไฟล์) ชื่อ = imgfile;
  3. บันทึกช่วยจำ(สารบัญ)ชื่อ = เนื้อหา;
  4. บันทึก(ผลลัพธ์) – ชื่อ = คำตอบ;
  5. ปุ่ม(…) - ชื่อ = chkfile;
  6. ปุ่ม(POST) – ชื่อ = PostBut;
  7. OpenDialog (กล่องโต้ตอบการเลือกไฟล์) – ชื่อ = PictDialog;

ปล่อยให้ IdHTTP1 และ CheckBox1 ไม่เปลี่ยนแปลง (เหนื่อย! :))))

เพื่อไม่ให้เกิดความบังเอิญ" แก้ไข» เส้นทางสู่การแก้ไข( imgfile.img) ตั้งค่าคุณสมบัติ ReadOnly เป็น True ในทำนองเดียวกัน ณ imgfile.imgและ ชเคไฟล์ตั้งค่าคุณสมบัติเปิดใช้งานเป็นเท็จ เราจะเปิดใช้งานโดยใช้ช่องทำเครื่องหมายเช่น เราจะให้โอกาสในการเลือกว่าจะอัปโหลดรูปภาพหรือไม่

สำหรับ OpenDialog( PictDialog) คุณต้องตั้งค่าตัวกรอง (คุณสมบัติตัวกรอง) ดังนี้:

การเตรียมภาพจริงจบลงแล้ว! มาเริ่มเขียนโค้ดกันดีกว่า!

ในโครงการเราจะสร้างกระแสข้อมูลโดยใช้ประเภทที่มาพร้อมกับ Indy - TidMultiPartFormDataStream.แม้ว่าเราจะเจอตัวเลือกการใช้งานโดยใช้ TStream แต่ก็ใช้งานได้ TidMultiPartFormDataStream –ง่ายขึ้น!

เพื่อให้ประเภทนี้พร้อมใช้งานสำหรับโครงการของเรา เราจำเป็นต้องเพิ่มไลบรารีต่อไปนี้ในการใช้งาน: IdMultipartFormData.

สำหรับ CheckBox1 สร้างเหตุการณ์ OnClick (โดยการคลิกสองครั้งที่เมาส์บนวัตถุ) และเพิ่มรหัสต่อไปนี้ในเหตุการณ์นี้:

ขั้นตอน TForm1.CheckBox1Click(Sender: TObject); start //ทำให้องค์ประกอบพาธของไฟล์ใช้งานหรือไม่ได้ใช้งานและปุ่มโต้ตอบ imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.ตรวจสอบ; จบ;

ที่นี่เราเปิดใช้งานวัตถุ imgfile.img และชเคไฟล์ขึ้นอยู่กับการมีอยู่ของเครื่องหมายถูก (หากทำเครื่องหมายในช่อง วัตถุจะเริ่มทำงาน)

ตอนนี้เรามาจัดระเบียบการเลือกรูปภาพกันดีกว่า เมื่อต้องการทำเช่นนี้ สร้างเหตุการณ์ OnClick บนปุ่ม ชเคไฟล์(โดยการดับเบิลคลิกที่วัตถุด้วย) และเขียนข้อความต่อไปนี้:

ขั้นตอน TForm1.chkfileClick (ผู้ส่ง: TObject); เริ่ม //เปิดกล่องโต้ตอบและป้อนเส้นทางแบบเต็มไปยังไฟล์ใน imgfile(TEdit) ถ้า PictDialog.Execute จากนั้น imgfile.Text:= PictDialog.FileName; จบ;

เหตุการณ์นี้จะทริกเกอร์กล่องโต้ตอบการเลือกรูปภาพ และหากผู้ใช้คลิก " เปิด" จากนั้นเส้นทางไปยังไฟล์นี้จะถูกเพิ่มเข้าไป imgfile.img.

และตอนนี้เรามาถึงปุ่มสุดท้าย "POST" สร้างเหตุการณ์ OnClick สำหรับปุ่มนี้ และเพิ่มรหัสต่อไปนี้:

ขั้นตอน TForm1.PostButClick (ผู้ส่ง: TObject); var dataPost:TIdMultiPartFormDataStream; เริ่ม dataPost:=TIdMultiPartFormDataStream.Create; dataPost.AddFormField("title",title.Text,"utf-8").ContentTransfer:= "8bit"; dataPost.AddFormField("content",content.Text,"utf-8").ContentTransfer:= "8bit"; ถ้า CheckBox1.Checked และ (trim(imgfile.Text)="") จากนั้น //ตรวจสอบว่าไฟล์ถูกเลือกหรือไม่ เริ่ม ShowMessage("คุณต้องเลือกไฟล์กราฟิก!"); ออก; จบ; ถ้า CheckBox1.Checked แล้ว dataPost.AddFile("file",imgfile.Text,""); //เพิ่มฟิลด์ด้วยไฟล์ response.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,); datapost.Free; end;

ดังนั้นตามลำดับ (แม้ว่าจะมีความคิดเห็น):

ดาต้าโพสต์ – วัตถุประเภท TIdMultiPartFormDataStream. ช่วยให้คุณสร้างโครงสร้างคำขอ POST ที่ประกอบด้วยฟิลด์ประเภทต่างๆ

ข้อมูลโพสต์ . AddFormField (" ชื่อ ", ชื่อ . ข้อความ ," utf -8 "). การถ่ายโอนเนื้อหา := " 8 นิดหน่อย "; – เพิ่มฟิลด์ชื่อ “title” ลงใน DataPost ซึ่งเป็นค่าจาก “title.Text” ตั้งค่าการเข้ารหัสของข้อมูลที่ส่งเป็น “utf-8” (พารามิเตอร์เป็นทางเลือก แต่ไม่มีการบ่งชี้ที่ชัดเจน Cyrillic จะถูกส่งด้วย เครื่องหมายคำถาม “?”) และวิธีการที่สำคัญมาก "การถ่ายโอนเนื้อหา" หากไม่มีวิธีนี้ ข้อมูลจะถูกส่งไปยังเซิร์ฟเวอร์ " อับราคาดาบรา" โปรดทราบว่าชื่อฟิลด์ (“หัวข้อ”) ในด้านการส่งจะต้องตรงกับชื่อที่ระบุในสคริปต์: $_POST["title"]

ข้อมูลจะถูกถ่ายโอนในลักษณะเดียวกันกับช่อง "เนื้อหา"

ข้อมูลโพสต์ . เพิ่มไฟล์ (" ไฟล์ ", imgfile.img . ข้อความ ,"") – ด้วยบรรทัดนี้ เราจะสร้างสตรีมพร้อมข้อมูลจากไฟล์

เพียงเท่านี้ข้อมูลก็ถูกสร้างขึ้น สิ่งที่เหลืออยู่คือการถ่ายโอนไปยังสคริปต์บนเซิร์ฟเวอร์และรับการตอบกลับ:

response.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,);

เพราะ TMemo ไม่เข้าใจแท็กตัวแบ่งบรรทัด "
" เราจะใช้ฟังก์ชัน " " เพื่อแทนที่ด้วยตัวแบ่งบรรทัดที่เข้าใจได้ #13#10"

เมื่อทุกอย่างเสร็จสิ้น ให้ล้างหน่วยความจำจากวัตถุ DataPost ด้วยบรรทัด:

ดาต้าโพสต์ฟรี;

แม้ว่าในตัวอย่างของเรา สิ่งนี้จะเกิดขึ้นโดยอัตโนมัติเมื่อสิ้นสุดกระบวนการ แต่ยังคง...

ผลลัพธ์ที่แท้จริงของโปรแกรมบนหน้าจอ:

ดังนั้น เราสามารถส่งข้อมูลหรือไฟล์ไปยังเซิร์ฟเวอร์ได้มากเท่าที่ต้องการ ประมวลผลข้อมูลนี้บนเซิร์ฟเวอร์ และรายงานผลลัพธ์ของสคริปต์กลับไปยังแอปพลิเคชัน อาจเป็นเพียง 0 หรือ 1 ซึ่งจะส่งสัญญาณให้แอปพลิเคชันตอบสนองต่อไป

ทั้งหมด. โชคดีทุกคน. ฉันหวังว่าข้อมูลนี้จะเป็นประโยชน์และคุณจะพบว่ามีประโยชน์

คุณสามารถดาวน์โหลดตัวอย่างและสคริปต์ที่เสร็จแล้วได้

รหัสโมดูลเต็ม:

หน่วยหลังหน่วย; อินเทอร์เฟซใช้ Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, IdMultipartFormData, Vcl.ExtDlgs; พิมพ์ TForm1 = คลาส (TForm) IdHTTP1: TIdHTTP; ชื่อเรื่อง: TEdit; เนื้อหา: TMemo; โพสต์แต่: TButton; การตอบสนอง: TMemo; Label1: TLabel; Label2: TLabel; Label3: TLabel; imgfile:TEdit; chkfile: TButton; Label4: TLabel; ช่องทำเครื่องหมาย 1: TCheckBox; PictDialog:TOpenDialog; ขั้นตอน PostButClick (ผู้ส่ง: TObject); ขั้นตอน chkfileClick (ผู้ส่ง: TObject); ขั้นตอน CheckBox1Click (ผู้ส่ง: TObject); ส่วนตัว ( ประกาศส่วนตัว ) สาธารณะ ( ประกาศสาธารณะ ) สิ้นสุด; var Form1: TForm1; ขั้นตอนการใช้งาน ($R *.dfm) TForm1.CheckBox1Click (ผู้ส่ง: TObject); start //ทำให้องค์ประกอบพาธของไฟล์ใช้งานหรือไม่ได้ใช้งานและปุ่มโต้ตอบ imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.ตรวจสอบ; จบ; ขั้นตอน TForm1.chkfileClick (ผู้ส่ง: TObject); เริ่ม //เปิดกล่องโต้ตอบและป้อนเส้นทางแบบเต็มไปยังไฟล์ใน imgfile(TEdit) ถ้า PictDialog.Execute จากนั้น imgfile.Text:= PictDialog.FileName; จบ; ขั้นตอน TForm1.PostButClick (ผู้ส่ง: TObject); var dataPost:TIdMultiPartFormDataStream; เริ่ม dataPost:=TIdMultiPartFormDataStream.Create; dataPost.AddFormField("title",title.Text,"utf-8").ContentTransfer:= "8bit"; dataPost.AddFormField("content",content.Text,"utf-8").ContentTransfer:= "8bit"; ถ้า CheckBox1.Checked และ (trim(imgfile.Text)="") จากนั้น //ตรวจสอบว่าไฟล์ถูกเลือกหรือไม่ เริ่ม ShowMessage("คุณต้องเลือกไฟล์กราฟิก!"); ออก; จบ; ถ้า CheckBox1.Checked แล้ว dataPost.AddFile("file",imgfile.Text,""); //เพิ่มฟิลด์ด้วยไฟล์ response.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost),"
",#13#10,); datapost.Free; end; end.