برنامه دلفی با استفاده از روش POST (ایندی) داده ها را به سرور ارسال می کند. اجزای Indy مورد استفاده در دلفی
Indy یک بسته نسبتاً قدرتمند از مؤلفه ها است که به شما امکان می دهد برنامه های مختلف شبکه را توسعه دهید. در این آموزش به شما خواهم گفت که چگونه می توانید برنامه های کاربردی سرویس گیرنده-سرور را با استفاده از اجزای TIdTCPClient و TIdTCPServer ایجاد کنید.
قبل از هر چیز می خواهم به دو مزیت مهم این اجزا اشاره کنم. مهمترین آنها Multithreading است به این معنی که سرور برای هر کلاینت یک Thread جداگانه ایجاد می کند و این قطعا بر عملکرد برنامه سرور در رایانه های دارای پردازنده چند هسته ای تأثیر می گذارد. مزیت دوم سهولت استفاده است. 10-20 خط کد برای نوشتن یک برنامه کاربردی سرویس گیرنده-سرور ساده کافی است. این بسته قطعات در مجموعه های استاندارد دلفی وجود دارد.
بیا بنویسیم یک برنامه ساده، که به شما امکان می دهد پیام متنی را از مشتری به سرور منتقل کنید. بیایید شروع به ایجاد سرور کنیم.
بیایید مولفه IdTCPServer را از تب "Indy Servers" در فرم قرار دهیم. ما تمام تنظیمات این کامپوننت را در زمان اجرا در رویداد OnCreate فرم انجام خواهیم داد:
IdTCPServer1.DefaultPort:= 12345;
IdTCPServer1.Active:= true;
همه چیز در اینجا ساده است - ما درگاهی را که سرور روی آن کار می کند نشان می دهیم و خود سرور را فعال می کنیم.
برای دریافت اطلاعات روی سرور از مشتری، یک رویداد ویژه "OnExecute" وجود دارد. این رویداد به شکل زیر است:
شروع
پایان؛
بیایید محتوای رویداد را به صورت زیر ویرایش کنیم:
رویه TForm3.IdTCPServer1Execute(AContext: TIdContext);
var
l:string; // متغیر رشته ای که در آن دریافت خواهیم کرد
شروع
l:= AContext.Connection.IOHandler.ReadLn();
Memo1.Lines.Add(l);
پایان؛
حال به محض اینکه پیامی روی سرور می رسد، آن را در متغیر رشته l می نویسیم و در یک فیلد متنی چند خطی خروجی می دهیم.
جای تعجب نیست که ایجاد سرور به پایان می رسد. ایندی بقیه کارها را برای ما انجام خواهد داد. بیایید با برنامه مشتری شروع کنیم. به سرور متصل می شود، پیامی برای آن ارسال می کند و از سرور جدا می شود.
بیایید ایجاد کنیم پروژه جدید، مؤلفه IdTCPClient را روی فرم قرار دهید، که می توانید آن را در برگه «Indy Clients» پیدا کنید. همچنین یک ویرایش ساده و یک دکمه قرار می دهیم. بیایید یک کنترل کننده رویداد OnClick برای دکمه ایجاد کنیم که داخل آن می نویسیم:
IdTCPClient1.Port:= 12345;
IdTCPClient1.Host:= '127.0.0.1';
IdTCPClient1.Connect.
IdTCPClient1.IOHandler.WriteLn(Edit1.Text);
IdTCPClient1.Disconnect.
این کد نیازی به قرار دادن در رویداد OnCreate ندارد. در صورت تمایل می توانید این کد را در هر جایی که می خواهید قرار دهید.
در خط اول یک پورت اختصاص می دهیم و لازم است همان پورتی را که در برنامه سرور تعیین کرده ایم مشخص کنیم، در غیر این صورت مشتری به سادگی سرور را پیدا نمی کند. سپس آدرس IP سرور را نشان می دهیم. خود سرور می تواند در هر دو قرار گیرد شبکه محلی، و از راه دور. در حالت دوم، اتصال از طریق اینترنت انجام می شود و باید یک آدرس IP در اینترنت مشخص کنید.
من آدرس "127.0.0.1" را مشخص کردم، به این معنی که سرور رایانه ای است که کلاینت روی آن اجرا می شود. این روش برای آزمایش برنامه های شبکه بسیار راحت است.
سپس اتصال برقرار می کنیم، پیام می فرستیم و ارتباط را قطع می کنیم، درست مانند خود پیام، می توانید آدرس IP را از Edit یا از هر متغیر رشته ای بگیرید.
کار بر روی برنامه مشتری نیز تکمیل شده است. همانطور که می بینید، Indy کار فوق العاده ای را برای ما انجام می دهد، که این امکان را برای یک برنامه نویس بی تجربه ایجاد می کند که برنامه شبکه خود را ایجاد کند.
پروتکل UDP برای انتقال بسیار خوب است پیام های متنی، یعنی می توانید چت های محلی و مانند آن را سازماندهی کنید. تصمیم گرفتم مثالی از ساده ترین کار با UDP در دلفی بزنم.
آموزش گام به گام:
مثال زدم اما ببخشید هر خطی را یادداشت نکردم چون... من هیچ چیز پیچیده ای نمی بینم و هر کسی می تواند آن را بفهمد.
در واقع، اگر چیزی نامشخص است، می توانید یک سوال از من بپرسید. و این هم کد واقعی:
استفاده می کند
ویندوز، پیامها، SysUtils، انواع، کلاسها، گرافیکها، کنترلها، فرمها،
گفتگوها، StdCtrls، IdUDPServer، IdBaseComponent، IdComponent، IdUDPBase،
IdUDPClient، IdSocketHandle؛
نوع
TForm1 = کلاس (TForm)
IdUDPClient1: TIdUDPClient.
IdUDPServer1: TIdUDPServer.
دکمه 1: TButton;
Label1: TLabel;
فرآیند FormCreate(فرستنده: TObject);
procedure FormClose(فرستنده: TObject؛ var Action: TCloseAction);
رویه Button1Click(فرستنده: TObject);
روش IdUDPServer1UDPRead(AThread: TIdUDPListenerThread؛ AData: TBytes;
ABinding: TIdSocketHandle)؛
خصوصی
(اعلامیه خصوصی)
عمومی
(اعلامیه های عمومی)
پایان؛
var
Form1: TForm1;
($R *.dfm)
[b]//روال ارسال پیام
رویه TForm1.Button1Click(فرستنده: TObject);
شروع
تلاش كردن
IdUDPClient1.Active:= True;
IdUDPClient1.Host:= "localhost";
IdUDPClient1.Connect.
اگر IdUDPClient1.Connected سپس
شروع
IdUDPClient1.Send(TimeToStr(Time));
Label1.Caption:= "ok";
پایان؛
IdUDPClient1.Active:= نادرست;
بوق;بیپ;بیپ;
بجز
MessageDlg("مشکلی پیش آمد =(", mtError, , 0);
پایان؛
پایان؛
[ب]
//روشن خاموش. سرور UDP هنگام راه اندازی و بستن فرم
روش TForm1.FormClose(فرستنده: TObject; var Action: TCloseAction);
شروع
IdUDPServer1.Active:= نادرست;
پایان؛
روش TForm1.FormCreate(فرستنده: TObject);
شروع
IdUDPServer1.Active:= True;
پایان؛
[b]//رویه واکنش سرور هنگام دریافت داده
روش TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
AData: TBytes; ABinding: TIdSocketHandle)؛
Var
i:عدد صحیح
s:String;
شروع
s:= "";
تلاش كردن
i:= 0;
در حالی که (AData[i] 0) انجام دهید
شروع
s:= s + chr(AData[i]);
i:= i + 1;
پایان؛
سرانجام
Label1.Caption:= s;
پایان؛
پایان؛
سرژ دوسیوکوف مایک فام
این مقاله نحوه ایجاد یک وب سرویس مستقل با استفاده از کیت Indy و دلفی 7 و نحوه استفاده از کیت Indy برای پشتیبانی از خدمات وب مبتنی بر دلفی 7 SOAP را به شما نشان می دهد. پشت اطلاعات اضافیبرای کسب اطلاعات در مورد ایجاد خدمات وب، به مقاله عالی نیک هاجز در سایت انجمن Borland مراجعه کنید: Shakespeare on the Web.
دیر یا زود، ممکن است لازم باشد سروری ایجاد کنید که یک سرور HTTP مستقل باشد و از خدمات وب پشتیبانی کند. به عنوان مثال، ممکن است بخواهید یک سرور برنامه مبتنی بر SOAP برای یک برنامه n لایه ساخته شده با استفاده از دلفی ایجاد کنید.
معرفی
کمک آنلاین دلفی بسیار عالی است آموزش متوالیدر مورد نحوه ایجاد یک وب سرویس، سرور MIDAS (مدل COM، DCOM)، اما عملاً هیچ اطلاعاتی در مورد ایجاد یک برنامه مستقل N-tier MIDAS بر اساس پروتکل SOAP وجود ندارد.
قبلا توسط Dave Nottage منتشر شده بود. این مقاله ایده چگونگی ایجاد یک وب سرویس در دلفی 6 با پشتیبانی SOAP و توانایی انتشار رابط های SOAP از Datamodule را شرح می دهد، یعنی این مقاله به شما امکان می دهد یاد بگیرید که چگونه n-tier خود را ایجاد کنید. سیستم های MIDAS
دلفی 7 بورلند و کیت جدید ایندی از این قابلیت پشتیبانی داخلی دارند.
با این حال، با وجود پشتیبانی داخلی، این ویژگی مستند نیست.
پست های اخیر در کنفرانس شبکه Borland و جستجوی وب با استفاده از سرور Google به نویسندگان این امکان را داده است تا راهی برای تبدیل کد موجود از دلفی 6 به دلفی 7 ایجاد کنند. اما همه چیز زمان خود را دارد.
ایده اصلی
این مقاله اولین قسمت از یک مجموعه سه قسمتی است. مقررات اصلی را شرح می دهد. بخش دوم و سوم به برخی از مشکلات و راه های حل آنها اختصاص خواهد یافت. بیایید شروع به توصیف ایده اصلی کنیم.
- یک سرور HTTP مستقل باشید.
- از Indy به عنوان یک پلت فرم استفاده کنید.
- پشتیبانی از انتشار از طریق پروتکل SOAP.
- قادر به انتشار SOAP DataModules باشد که به شما امکان می دهد سرور n-tier خود را بر اساس SOAP/HTML ایجاد کنید.
سرور HTTP و SOAP
بسیاری از مردم Indy را می شناسند و قبلاً از مؤلفه های THTTPServer استفاده کرده اند. قرار دادن این کامپوننت در فرم درخواست آسان است، اما چگونه میتوان آن را از SOAP پشتیبانی کرد؟ در دایرکتوری "C:Program FilesBorlandDelphi7SourceIndy" می توانید فایل IdHTTPWebBrokerBridge.pas را پیدا کنید. این دقیقا همان چیزی است که شما نیاز دارید.
این فایل بخشی از فایل اجرایی Indy نیست، بنابراین باید آن را به عنوان یک فایل پروژه استاندارد در پروژه فعلی خود قرار دهید. (برای کامپایل پروژه، به فایل IdCompilerDefines.inc نیز نیاز دارید.) این فایل ها باید در دایرکتوری پروژه فعلی کپی شوند. ممکن است تغییرات کد برای افزایش سرعت لازم باشد، بنابراین بهتر است این فایل ها را جدا از توزیع Indy نگه دارید.
در زیر پیاده سازی یک جزء جایگزین از THTTPServer، گسترش یافته برای پشتیبانی از بسته های SOAP، به نام TIdHTTPWebBrokerBridge را شرح می دهد. این ساختار کلاسی است که از TCustomHTTPServer به ارث می رسد و از اتصال درخواست اولیه پشتیبانی می کند.
از آنجایی که این کلاس از پالت قابل دسترسی نیست، هنگام اجرای کد خود باید آن را به عنوان یک شی معمولی تعریف کنید.
این شی را می توان دقیقاً به همان روشی که یک سرور THTTPS معمولی استفاده کرد، به استثنای آن دسته از ویژگی های اضافی که عملکرد با SOAP را امکان پذیر می کند.
با این حال، ابتدا به تهیه کد لازم می پردازیم.
وب بروکر و ایندی
برای کسانی که قبلا خدمات وب ایجاد کرده اند، می دانید که از آن استفاده می کنید وب بروکر. دلفی 7 مانند دلفی 6 از معماری WebBroker برای پشتیبانی از SOAP استفاده می کند.
بنابراین باید یک ماژول ایجاد کنید TWebModuleو سه جزء زیر را در آن قرار دهید: THTTPSoapDispatcher، THTTPSoapPascalInvoker و TWSDLHTMLPublish. همه آنها از برگه WebServices پالت مؤلفه در دسترس هستند. پس از پیوند SOAPDispatcher با SOAPPascalInvoker، فرم درخواست آماده است. نتیجه نهایی باید چیزی شبیه به چیزی باشد که در شکل زیر نشان داده شده است:
(ماژول uWebModule.pas)
بهتر است همه چیز را همانطور که هست رها کنید، زیرا نیازی به تغییر یا اجرای کد سفارشی برای این فرم نیست.
WebModule و Indy
بیایید به قسمت دیگر کد مورد نیاز برای پیاده سازی سرور HTTP برویم.
همانطور که می بینید، TIdHTTPWebBrokerBridge دارای یک متد RegisterWebModuleClass است که به شما امکان می دهد WebModule خود را ثبت کرده و در اختیار سرور قرار دهید.
بنابراین، پس از ایجاد شی سرور fServer، فقط باید کلاس fServer.RegisterWebModuleClass (TwmSOAPIndy) را فراخوانی کنید.
توجه داشته باشید.در یک پیاده سازی معمولی TIdHTTPWebBrokerBridge، هر بار که درخواستی دریافت می شود، یک شی TwmSOAPIndy ایجاد می شود. بدیهی است که این کار ضروری نیست. بنابراین، کلاس را می توان برای ایجاد ایجاد دائمی تغییر داد از این شیتا زمانی که شی Server وجود دارد. توصیه می شود برای اطلاعات بیشتر به مستندات پیاده سازی کلاس مراجعه کنید.
سرور آماده است؟
اجزای Indy مورد استفاده در دلفی 6.
علاوه بر سرویسها و پروتکلهای اولیه اینترنت، طیف گستردهای از خدمات اضافی نیز وجود دارد که اغلب توسعهدهندگان اینترنت از قابلیتهای آنها استفاده میکنند. علاوه بر این، امکان نمایش اطلاعات با استفاده از مرورگر همیشه راه حل قابل قبولی برای برنامه های اینترنتی نیست. در این مورد، منطقی است که از زیرساخت اینترنت برای تبادل داده ها استفاده کنیم و نمایش اطلاعات را از طریق برنامه های کاربردی مشتری پیچیده تر توسعه یافته، به عنوان مثال، در دلفی فراهم کنیم.
فرض کنید باید منطق سرور تخصصی را پیاده سازی کنید که در وب سرورهای استاندارد گنجانده نشده است. برای حل این دسته از مشکلات، دلفی شامل کتابخانه اینترنت مستقیم (Indy) از Nevrona Designs (http://www.nevrona.com/Indy/) است. این کتابخانه که به طور خاص برای Borland Delphi توسعه یافته است، در حال حاضر دارای هشت نسخه است که آخرین آنها در نسخه جدیددلفی مجموعه کامپوننت ها به سه گروه کلاینت (Indy Client)، سرور (Indy Servers) و کمکی (Indy Misc) تقسیم می شوند.
مشتریان ایندی و سرورهای ایندی
اکثریت اجزای ایندیسرورهای Client و Indy جفتهایی هستند که مربوط به بخشهای کلاینت و سرور پروتکلها و سرویسها هستند (به استثنای اجزای منفرد، عمدتاً مبتنی بر سرور مانند TunnelMaster و TunnelSlave)، و امکان استفاده از پروتکلهایی مانند TCP/IP، UDP، خدمات NNTP، SMTP، FTP، HTTP، و همچنین خدمات ECHO، FINGER، WHOIS و غیره.
اجزای سرویس گیرنده Indy با استفاده از سوکت ها نوشته می شوند. سوکت سمت کلاینت نیاز به اتصال به سرور دارد. اگر اتصال برقرار شود، سرویس گیرنده و سرور می توانند شروع به تبادل پیام کنند. این پیام ها ماهیت متفاوتی دارند، اما معمولا تبادل با استفاده از یک پروتکل خاص (به عنوان مثال، HTTP) انجام می شود.
TIdTCPClient و TIdTCPServer
این مؤلفهها برای پشتیبانی از یکی از پروتکلهای اصلی شبکه - TCP (پروتکل کنترل انتقال) استفاده میشوند و همچنین کلاسهای پایه برای مؤلفههای TIdSMTP و TIdFTP هستند. کلاس TIdTCPServer دارای یک ویژگی ThreadMgr است که به طور پیش فرض صفر است. اگر وقتی TIdTCPServer فعال است ThreadMgr صفر باشد، کلاس TIdThreadMgrDeafault به طور ضمنی ایجاد می شود. در غیر این صورت، از مدیر فرآیند نصب شده استفاده می شود.
TIdUDPClient و TIdUDPServer
از این قطعات برای پشتیبانی استفاده می شود پروتکل شبکه UDP (پروتکل دیتاگرام کاربر) و همچنین کلاس های پایه برای تعدادی دیگر از اجزای Indy هستند.
TIdChargenServer
مولفه برای تولید نمادهای تصادفی، معمولاً برای اهداف آزمایشی استفاده می شود.
TIdDayTime و TIdDayTimeServer
مولفه ها برای ارائه سرویس زمان استفاده می شوند. مشتری درخواست می کند و سرور تاریخ و زمان فعلی را گزارش می دهد.
TIdDNSResolver
این یک مؤلفه مشتری است که درخواست های یک سرور DNS (سرویس نام دامنه) را ارائه می دهد. پرس و جوهای سرور DNS برای جایگزینی نام رایانه با آدرس IP آن طراحی شده اند. TIdDNSResolver از نوادگان کلاس TIdUDPClient است.
TIdDICTServer
یک جزء سرور که از Dictionary Server Protocol (DICT) پشتیبانی می کند، یک فرهنگ لغت سمت سرور مبتنی بر پروتکل TCP که به مشتری امکان دسترسی به فرهنگ لغت زبان طبیعی را می دهد.
سرور TIdDISCARD
جزء سروری که از سرور رکوردها پشتیبانی می کند. ضبط ها را می توان به عنوان یک ابزار اشکال زدایی و اندازه گیری استفاده کرد. سرویس سوابق به سادگی هر داده ای را به هر کسی که مایل به دریافت آن است تحویل می دهد.
TI dEcho و TI dECHOServer
اجزا برای ارائه یک سرویس پاسخ طراحی شده اند که معمولاً برای بررسی سلامت شبکه استفاده می شود. مشتری یک پیام متنی به سرور ارسال می کند، سرور پیام را به مشتری برمی گرداند. اگر پیام مخدوش باشد، شبکه دچار مشکل می شود.
TIdFinger و TIdFingerServer
اجزا به گونه ای طراحی شده اند که پروتکلی را ارائه دهند که به کاربر اجازه می دهد داده های مربوط به حضور سایر کاربران را در سیستم پرس و جو کند. برخی از سرورها چنین درخواست های مشتری را مدیریت می کنند. استفاده از این جفت مؤلفه به شما این امکان را میدهد تا به درخواستهای مشتری سرویس دهید که حضور سایر کاربران را در سیستم تعیین میکند.
این مؤلفه شامل پشتیبانی کامل از پروتکل انتقال فایل - FTP (پروتکل انتقال فایل) است. انتقال داده غیرفعال و فعال و همچنین عملیاتی مانند GET و PUT، حذف دایرکتوری ها، به دست آوردن سهمیه، اندازه فایل و دایرکتوری پشتیبانی می شود. TI dFTP از کلاس TIdSimpleServer برای عملکرد استفاده می کند. هنگامی که انتقال فایل FTP در حال انجام است، یک اتصال TCP ثانویه برای انتقال داده باز می شود و پس از انتقال داده بسته می شود. این اتصال "پیوند داده" نامیده می شود که برای هر فایل در حال انتقال منحصر به فرد است.
TIdGopher و TIdGopherServer
این اجزا برای ارائه یک پروتکل شبکه ای طراحی شده اند که جایگزین آن شده است اخیرااز WWW ( در سراسر جهانوب) پروتکل HTTP. سروری که این پروتکل را پیادهسازی میکند، یک سیستم پشتیبانی از جریان سند توزیع شده سلسله مراتبی ارائه میکند. نمونه ای از استفاده از این جفت کامپوننت، واقع در دایرکتوری demosindyGopherClient و demosindy GopherServer، نشان می دهد که چگونه با استفاده از این پروتکل می توانید اطلاعاتی در مورد فایل های موجود در رایانه خود، از جمله فایل های بسته، در شبکه محلی ارائه دهید.
TIdHostNameServer
یک جزء سرور طراحی شده برای ارسال نام سرور محلی به مشتریان.
سرور TIdHTTP و TIdHTTPS
مؤلفه ها برای ارائه پروتکل شبکه HTTP استفاده می شوند (نسخه های 1.0 و 1.1 پشتیبانی می شوند، از جمله عملیات GET، POST و HEAD). علاوه بر این، پشتیبانی برای احراز هویت و استفاده از سرورهای پروکسی ارائه می شود. جزء سرور برای ارائه خدمات به وب سرور دیگری که از پروتکل معینی پشتیبانی می کند استفاده می شود. TIdHTTPServer اجرای عملکردهایی مانند کوکی ها، مدیریت حالت و غیره را تسهیل می کند.
TIdIcmpClient
یک جزء مشتری طراحی شده برای ارائه پروتکل پیام کنترل اینترنت (ICMP)، که برای انجام عملیات پینگ و ردیابی شبکه استفاده می شود.
یک جزء مشتری طراحی شده برای ارائه پروتکل Post Office (POP)، شامل پشتیبانی از رمزگذاری و رمزگشایی MIME، و انتقال کاراکتر چند بایتی.
سرور TIdIMAP4
یک جزء سرور طراحی شده برای پشتیبانی از عملیات IMAP (پروتکل دسترسی به پیام های اینترنتی) روی سرور. پروتکل به شما امکان می دهد پیام ها را جستجو کنید پست الکترونیکروی سرور تفاوت بین پروتکل های IMAP و POP این است که پروتکل POP نیاز دارد حافظه اضافیبرای ذخیره داده ها، و پروتکل IMAP به جای ماشین سرویس گیرنده به سرور دسترسی پیدا می کند. IMAP4 برای جایگزینی POP3 ایجاد شد، اما POP3 تا به امروز یک استاندارد پرکاربرد باقی مانده است.
سرور TIdIRCS
یک مؤلفه سرور طراحی شده برای پشتیبانی از متداول ترین عملیات سرویس مورد استفاده در اینترنت که معمولاً چت نامیده می شود. مؤلفه اساسی را ارائه می دهد بلوک های ساختمانبرای سرور IRC (Internet Relay Chat).
TIdMappedPortTCP
یک جزء سرور طراحی شده برای ایجاد پورت های نقشه برداری شده، که اغلب در سرورهای پروکسی استفاده می شود. روش های این کامپوننت به شما امکان می دهد یک پورت را به پورت دیگر نگاشت کنید. به عنوان مثال، پورت 80 را می توان به پورت 3000 نگاشت، و تمام درخواست ها به پورت اول (پورت 80) به پورت دوم (پورت 3000) ارسال می شود.
سرور TIdNNTP و TIdNNTPS
این مؤلفهها برای پشتیبانی از پروتکل انتقال اخبار شبکه (NNTP) مورد استفاده در سرویسهای خبری مورد نیاز هستند. مؤلفه مشتری شامل پشتیبانی از رمزگذاری و رمزگشایی MIME، و همچنین پشتیبانی از کاراکترهای چند بایتی و رمزگذاری های جایگزین است. مؤلفه سرور به شما امکان می دهد سرورهای خبری ایجاد کنید. توجه به این نکته مهم است که TIdNNTPServer یک سرور خبری با امکانات کامل نیست، بلکه مؤلفهای است که عملکرد اولیه چنین سروری را فراهم میکند.
TIdQOTD و TIdQOTDSserver
مولفه ها برای ارائه خدمات نقل قول روز استفاده می شوند. مؤلفه مشتری به نمونه مؤلفه سرور متصل می شود تا قیمت روزانه را به دست آورد. هر نمونه سرور شامل یک پایگاه داده استنادی منحصر به فرد است.
یک مؤلفه مشتری طراحی شده برای استفاده در برنامه های کاربردی پروتکل انتقال نامه ساده (SMTP) که از احراز هویت، رمزگذاری و رمزگشایی MIME و پشتیبانی از کاراکترهای چند بایت پشتیبانی می کند.
یک جزء مشتری طراحی شده برای ارائه SNTP (پروتکل زمان شبکه ساده) - یک سرویس زمان. می توان برای اتصال به هر سرویس زمانی برای تعیین استفاده کرد تاریخ های فعلیو زمان.
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 شامل BASE64، UUE، Quoted Printable و سایر فرمتهای ارتباطی رایج ایمیل، رمزگذارها (MD2، MD4 و MD5) برای استانداردهای رمزنگاری مورد استفاده برای ذخیره رمزهای عبور و امضای الکترونیکیبه شکل غیر قابل برگشت (به سختی رمزگشایی) و همچنین بسیاری از مؤلفه ها و ابزارهای مفید دیگر که اغلب در توسعه برنامه های کاربردی اینترنتی استفاده می شوند.
TIdAntiFreeze
با توجه به الگوریتم های مبتنی بر بلوک اجزای Indy، اغلب به نظر می رسد که برنامه زمانی که اتصال کار می کند گیر کرده است. برای حذف استفاده از فرآیندهای ثانویه (رشته ها) هنگام سازماندهی ارتباطات برای جلوگیری از انجماد برنامه، کافی است جزء مشخص شده را روی فرم قرار دهید.
این مؤلفه با تجزیه درخواستها از پشته پروتکل TCP/IP و ارسال پیام به برنامه در طول تأخیر زمانی که اتصالات خارجی مسدود میشوند کار میکند، که این توهم کد در حال اجرا را ایجاد میکند. از آنجایی که کامپوننت بر روی اتصالات مسدود شده فقط برای فرآیند اصلی تأثیر می گذارد، استفاده از TIdAntiFreeze در فرآیندهای ثانویه برنامه مورد نیاز نیست. به خاطر داشته باشید که مؤلفه TIdAntiFreeze اتصالات را کند می کند زیرا فرآیند اصلی به طور دوره ای برای پردازش پیام ها قطع می شود. بنابراین باید مراقب بود که برنامه در حال توسعه زمان زیادی را برای پردازش پیامها از جمله OnClick، OnPaint، OnResize و غیره صرف نمیکند. استفاده از این مؤلفه اجباری نیست، اما به شما امکان می دهد مشکل همگام سازی اتصالات با رابط بصری برنامه را حل کنید.
TIdDateTime Stamp
کلاسی برای انجام ریاضیات تاریخ و زمان مربوط به این واقعیت است که پروتکل های اینترنتی از فرمت های مختلف تاریخ و زمان استفاده می کنند. علاوه بر این، کلاینت ها و سرورها ممکن است در مناطق زمانی مختلف قرار داشته باشند.
TIdIPWatch
این یک جزء مبتنی بر تایمر است که دائماً تغییرات آدرس IP رایانه را کنترل می کند. رویدادهای مؤلفه زمانی رخ می دهند که تغییری شناسایی شود. این کامپوننت معمولا برای تشخیص اینکه آیا کامپیوتر به اینترنت یا هر شبکه دیگری متصل است استفاده می شود. تغییر آدرس IP در این وضعیت ممکن است به دلیل تخصیص آدرس IP توسط سرور DHCP (پروتکل پیکربندی میزبان پویا) هنگام اتصال به شبکه جدید رخ دهد.
TIdLogDebug
هدف این مؤلفه رهگیری رویدادهای هر مؤلفه مشتری یا سرور و قرار دادن رکورد رویداد در آن است فایل مشخص شده. این کامپوننت برای اشکال زدایی کامپوننت های Indy بسیار مفید است.
TIdMessage
این مؤلفه در ترکیب با سایر مؤلفه ها برای رمزگشایی یا رمزگذاری صحیح پیام ها استفاده می شود. اینها می توانند اجزای POP، SMTP و NNTP باشند. کلاس از رمزگذاری و رمزگشایی MIME، کاراکترهای چند بایتی و کدگذاری ISO پشتیبانی می کند.
TIdNetwork Calculator
یکی از معدود مؤلفههای Indy که میتوان هنگام ساخت برنامهها از آن استفاده کرد. از ماشین حساب شبکه می توان برای انجام محاسبات روی آدرس های IP از جمله ماسک های شبکه، زیر شبکه، کلاس های شبکه و غیره استفاده کرد.
TIdThreadMgrDefault
کامپوننت به طور پیش فرض کنترل فرآیندهای ثانویه را فراهم می کند. زمانی ایجاد می شود که هر جزء Indy که از مدیریت فرآیند پشتیبانی می کند نمونه ای از کلاس TIdThreadManager تعریف نشده باشد. این مؤلفه فقط قابلیت های اساسی را برای مدیریت فرآیندهای ثانویه فراهم می کند: ایجاد و از بین بردن آنها در صورت تقاضا.
TIdThreadMgrPool
یک مؤلفه مدیریت فرآیند پیشرفتهتر از TIdThreadMgrDefault، زیرا فرآیندها را به جای ایجاد یا از بین بردن آنها در صورت تقاضا، ادغام میکند.
TIdVCard
VCard معادل الکترونیکی کارت ویزیت است و ممکن است حاوی اطلاعات شخصی و اطلاعات گرافیکی مالک باشد.
TIdIMFDecoder
برای رمزگشایی پیام های اینترنتی طراحی شده است. مانند سایر اجزای رمزگذار، از نسل TIdCoder است. کلاس TIdCoder بر اساس استاندارد قالب پیام متنی اینترنتی ARPA RFS-822، پیشنهاد شده در آگوست 1982، و استاندارد پیام رسانی USENET RFC 1036، پیشنهاد شده در دسامبر 1987، رمزگشایی می شود.
این مؤلفه کلاس TIdCoder را گسترش می دهد تا امکان تشخیص فرمت RFS-822 توسط زمینه هدر، ارائه حالت رمزگشایی در دریافت و رمزگذاری و رمزگشایی MIME را فراهم کند. جزء TIdIMFDecoder در کلاس TIdMessageClient برای رمزگشایی پیام های دریافتی و ارسال شده استفاده می شود.
TIdQuotedPrintableEncoder
QuotedPrintableEncoder به شما امکان می دهد متن را در قالب مشخص شده رمزگشایی کنید. می تواند به عنوان یک مؤلفه مستقل با یک نوع رمزگذاری مشخص عمل کند و به پیام های حاوی یک نوع رمزگذاری جدید اجازه انتقال داده شود.
TIdBase64Encoder
الگوریتم رمزگذاری دیگری را پیاده سازی می کند که امکان انتقال کاراکترهای غیر قابل چاپ را فراهم می کند.
TIdUUEncoder
یکی از اولین الگوریتم های رمزگذاری، رمزگذاری 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 فقط در دلفی 6 در دسترس هستند و در Kylix موجود نیستند. این به دلیل پیچیدگی پروتکل است که در مورد اجرای ویندوز بر اساس عملکردهای سیستم عامل است.
نمونه هایی از استفاده از مؤلفه های Indy را می توان در دایرکتوری های /Delphi6/Demos/Indy یافت. در مجموع، کتابخانه Indy در نسخه 8.0 شامل 69 جزء است. بیان شده است که در نسخه 9.0 کتابخانه مشخص شده شامل 86 جزء خواهد بود. همه اجزای یکپارچه شده و در دلفی 6 و کیلیکس گنجانده شدهاند، که به آنها اجازه میدهد برای توسعه برنامههای چند پلتفرمی استفاده شوند. همه اجزای Indy از multithreading پشتیبانی می کنند.
اجزای Indy تقریباً تمام عملکردهای موجود در مؤلفه های اینترنت و Fastnet را اجرا می کنند، همانطور که به وضوح در جدول نشان داده شده است.
اجزای Fastn et | اجزای ایندی | هدف اجزاء | |
---|---|---|---|
1 | TserverSocket، TClientSocket | TIdTCPserverSocket، TIdTCPClientSocket | تعامل بین دو کامپیوتر (کلاینت و سرور) با استفاده از پروتکل TCP/IP |
2 | TNMDayTime | TIdDayTime، TIdDayTimeServer | سرور را برای زمان فعلی پرس و جو کنید |
3 | TNMEcho | TIdEcho، TIdEchoServer | برای ارتباط با سرور پاسخ استفاده می شود |
4 | TNMFinger | TIdFinger، TIdFingerServer | برای به دست آوردن اطلاعات در مورد کاربر از سرور جستجوی اینترنتی استفاده می شود |
5 | TNMFTP | سرور TIdFTP، TIdTrivialFTP، TIdTrivialFTPS | امکان انتقال فایل با استفاده از پروتکل FTP |
6 | TNMHTTP | سرور TIdHTTP، TIdHTTPS | از پروتکل HTTP برای تبادل داده استفاده کنید |
7 | TNMMsgServ، TNMMsg | برای انتقال پیام های متنی ساده از مشتری به سرور استفاده می شود | |
8 | TNMNNTP | سرور TIdNNTP، TIdNNTPS | پشتیبانی از تبادل داده با سرور اخبار |
9 | TNMPOP3 | TIdPOP3 | برای دریافت ایمیل از سرور ایمیل با استفاده از پروتکل POP3 استفاده می شود |
10 | TNMSMTP | TIdSMTP | برای ارسال ایمیل از طریق سرور ایمیل اینترنتی استفاده می شود |
11 | TNMStrm، TNMStrmServ | داده های باینری را با استفاده از پروتکل TCP/IP به یک جریان ارسال می کند | |
12 | TNMUDP | TIdUDP، TIdUDPServer | انتقال داده ها با استفاده از پروتکل UDP |
13 | TpowerSock، TNMGeneralServer | کلاسهای کپسولهشده با مؤلفهها که مبنای نوشتن کلاینتهای خود (Powersock) و سرورها (NMGeneralServer) هستند. | |
14 | پردازنده TNMUUP | TIdUUEncoder، TIdUUDecoder | رمزگذاری مجدد را انجام دهید فایل های باینریبه فرمت MIME یا UUENCODE |
15 | TNMURL | رشته ها را به فرمت HTMLو رمزگذاری معکوس را انجام می دهد |
استثناها کلاسهایی مانند TNMMsgServ، TNMMsg، TNMStrm، TNMStrmServ، TpowerSock، TNMGeneralServer، TNMURL هستند که یا پروتکلهای منسوخ را پیادهسازی میکنند یا دارای عملکرد پیادهسازی شده در گروه بزرگی از کلاسهای جایگزین هستند.
با این حال، بر خلاف پیشینیان خود - اینترنت و اجزای Fastnet، Indy شامل اجزای سرور و مؤلفههای غنیتری برای رمزگذاری و رمزگذاری دادهها، و همچنین پشتیبانی از احراز هویت (پالت Indy Misc) است. همانطور که از جدول بالا مشاهده می شود، پروتکل ها و خدمات اصلی نه تنها توسط مشتری، بلکه توسط اجزای سرور نیز ارائه می شوند. اینها خدمات زمان، خدمات پاسخ، به دست آوردن اطلاعات کاربر، و همچنین پروتکل های HTTP، NNTP، UDP و حتی ساده ترین نسخه FTP هستند.
چند نمونه از استفاده از کامپوننت های Indy
در مؤلفههای Indy موجود در دلفی، آدرس IP در ویژگی Host، معمولاً فقط در برنامههای کلاینت تعریف میشود. مؤلفههای میزبان سرور روشهایی دارند که به شما امکان میدهند نظرسنجی پورت مربوطه را شروع یا متوقف کنید - برای مثال، تغییر ویژگی Active مؤلفه IdTCPServer، نظرسنجی پورت مربوطه را شروع یا متوقف میکند. هنگامی که ارتباط بین سرویس گیرنده و سرور برقرار شد، انتقال داده می تواند آغاز شود.
اجزای Indy تاکید زیادی بر امنیت و قابلیت اطمینان هنگام کار با داده ها دارند. برای مثال، مؤلفه IdTCPClient دارای متدهای Connect و Disconnect است. با استفاده از یک تکنیک برنامه نویسی مانند کد زیر از سمت مشتری:
با TCPClient اتصال را شروع کنید. lstMain.Items.Add(ReadLn) را امتحان کنید. در نهایت قطع اتصال؛ پایان؛ پایان؛
و با استفاده از ویژگی Connection به عنوان یک پارامتر به نمونه AThread کلاس TIdPeerThread از سمت سرور ارسال می شود:
با AThread.Connection WriteLn را شروع کنید ("سلام از سرور پایه ایندی سرور."); قطع شدن؛ پایان؛
می توانید روی اجرای عادی اتصال یا مدیریت صحیح خطا حساب کنید.
به متدهای ReadLn و WriteLn کلاسهای مربوطه توجه کنید - آنها شبیه دستورات استاندارد پاسکال I/O هستند. این ادای احترام به تکنیک برنامه نویسی یونیکس است که در آن اکثر عملیات سیستم با خواندن و نوشتن در فایل های مربوطه انجام می شود.
درست مانند مؤلفههای Fastnet، کلاسهای مؤلفه Indy رویدادهایی دارند که میتوان از آنها برای ارائه مدیریت رویداد استفاده کرد. به عنوان مثال، می توانید ترتیبی دهید که هنگام اتصال به یک کلاینت، پیامی در فرم نمایش داده شود:
رویه TForm1.IdECHOServer1Connect(AThread: TIdPeerThread); start lblStatus.caption:= "[ خدمت به مشتری ]"; پایان؛
Indy اجزایی را ارائه می دهد که پروتکل ها را با بخش های کلاینت و سرور پیاده سازی می کند که منحصر به این کتابخانه است. اجزای TIdGopherServer و TIdGopher به لطف متدهای GetExtendedMenu، GetFile، GetMenu، GetTextFile در سمت کلاینت و ReturnGopherItem، SendDirectoryEntry در سمت سرور، به مشاهده فایل ها کمک می کنند. انواع مختلف، از جمله مواردی که به عنوان پنهان علامت گذاری شده اند، و همچنین فهرست های موجود در کامپیوتر از راه دور(مشابه کاری که دستور dir *.* در آن انجام می دهد سیستم عامل MS-DOS).
با استفاده از مؤلفه های IdSMTP و IdMessage، می توانید به راحتی برنامه وب خود را ایجاد کنید که می تواند با استفاده از پروتکل SMTP نامه ارسال کند.
در این حالت، کلاس IdMessage (یکی از 23 مؤلفه از صفحه Indy Misc) مسئول تولید پیام است که از نام آن بر میآید و IdSMTP برای سازماندهی ارتباط با سرور ایمیل است.
فناوری مورد استفاده در Indy از عملیات قفل خواندن و نوشتن استفاده می کند. هر عملیات اتصالی که در Indy استفاده میشود منتظر میماند تا اتصال کامل شود. هنگام کار با اجزای مشتری Indy، معمولاً باید موارد زیر را انجام دهید:
- درخواست اتصال به سرور؛
- درخواست خواندن و نوشتن به سرور (بسته به نوع سرور، مرحله یک بار انجام می شود یا چندین بار تکرار می شود).
- اتصال به سرور را قطع کرده و قطع کنید.
اجزای Indy طوری طراحی شده اند که سطح فوق العاده بالایی از انتزاع را ارائه دهند. پیچیدگی ها و جزئیات پشته TCP/IP از دید برنامه نویس پنهان می شود تا بتواند بر روی کار مورد نظر تمرکز کند.
مثال کوچک زیر یک جلسه معمولی کلاینت را نشان می دهد:
با IndyClient Host:= "zip.pbe.com"; // میزبان برای تماس پورت:= 6000; // پورت برای تماس با سرور در اتصال. سعی کنید // کد شما به اینجا می رود در نهایت Disconnect; پایان؛ پایان؛
در مثال، حتی اگر اتصال به سرور برقرار نشود، به دلیل استفاده از دستور try-finally، اتصال به راحتی قطع می شود.
اجزای سرور ایندی انواع مدلهای سرور را توصیف میکنند که بسته به نیاز شما و پروتکلی که استفاده میکنید میتوان از آنها استفاده کرد.
TIdTCPServer رایج ترین مؤلفه سرور مورد استفاده است که یک فرآیند ثانویه مستقل از فرآیند برنامه اصلی ایجاد می کند. فرآیند ایجاد شده منتظر درخواست های دریافتی از طرف می ماند مشتریان بالقوه. یک فرآیند ثانویه فردی برای هر مشتری که به درخواست آن پاسخ می دهد ایجاد می شود. رویدادهایی که در طول فرآیند تعمیر و نگهداری اتفاق میافتند به زمینه فرآیندهای مربوطه مربوط میشوند.
به عبارت دیگر، برای هر اتصال کلاینت، کلاس TIdTCPServer از یک رشته ثانویه منحصر به فرد با فراخوانی کنترل کننده رویداد OnExecute آن رشته استفاده می کند. پارامتر رسمی متد OnExecute ارجاع به نمونه ای از کلاس Athread مربوط به رشته ایجاد شده است. ویژگی Connection این کلاس مرجعی به کلاس TIdTCPConnection است که نمونه ای از آن برای پردازش درخواست مشتری ایجاد می شود. TIdTCPConnection از خواندن و نوشتن از طریق اتصال و همچنین برقراری و خاتمه یک جلسه ارتباطی پشتیبانی می کند.
پروتکل UDP بدون ایجاد ارتباط با سرور کار می کند (هر بسته ارسالی مجموعه ای مستقل از داده ها است و بخشی از یک جلسه یا اتصال بزرگتر نیست). در حالی که TIdTCPServer رشته های جداگانه ای را برای هر اتصال ایجاد می کند، TIdUDPServer از یک رشته اصلی یا یک رشته ثانویه استفاده می کند که تمام درخواست های پروتکل UDP را مدیریت می کند. هنگامی که TIdUDPServer فعال است، یک رشته برای گوش دادن به بسته های UDP ورودی ایجاد می شود. برای هر بسته دریافتی، بسته به مقدار ویژگی ThreadedEvent، یک رویداد OnUDPRead یا در رشته اصلی یا در زمینه رشته شنیداری مطرح میشود. هنگامی که ThreadedEvent به False ارزیابی می شود، رویداد در رشته اصلی رخ می دهد، در غیر این صورت در رشته شنیداری رخ می دهد. در حالی که رویداد در حال پردازش است، سایر عملیات سرور مسدود می شوند. بنابراین، مهم است که اطمینان حاصل شود که رویه های OnUDRead در سریع ترین زمان ممکن اجرا می شوند.
اگر نیاز به ایجاد یک برنامه کلاینت جدید برای سرور موجود با استفاده از پروتکل موجود دارید، وظیفه شما صرفاً توسعه و اشکال زدایی برنامه مشتری است. با این حال، زمانی که شما باید هم مشتری و هم برنامه سرورچه از یک پروتکل موجود یا یک پروتکل جدید استفاده کنیم، ما با مشکل کلاسیک "مرغ و تخم مرغ" روبرو هستیم. برنامه نویسی را از کجا شروع کنیم - از مشتری یا از سرور؟
بدیهی است که هم کلاینت و هم سرور باید در نهایت ایجاد شوند. برای بسیاری از برنامه ها، به ویژه آنهایی که از پروتکل مبتنی بر متن (مانند HTTP) استفاده می کنند، شروع ساخت برنامه با طراحی سرور آسان تر است. و برای رفع اشکال یک کلاینت راحت وجود دارد که از قبل وجود دارد. این یک برنامه کنسول Telnet است که هم در ویندوز و هم در یونیکس موجود است.
اگر کنسول را تایپ کنید دستور تلنت 127.0.0.1 80 با آدرس IP رایانه محلی و شماره پورت 80 که به طور پیش فرض توسط سرورهای وب استفاده می شود، سپس برنامه با متن نشان داده شده در شکل پاسخ می دهد. 6، در مورد سیستم عامل ویندوز 2000 و IIS 5.0.
برای ایجاد ساده ترین سرور با استفاده از مؤلفه های Indy به موارد زیر نیاز دارید:
اگر نیاز به طراحی سروری دارید که نه تنها هنگام قطع اتصال به مشتریان خود به درستی اطلاع دهد، بلکه اطلاعاتی را در مورد موقعیت های خطای رخ داده در اختیار آنها قرار دهد، به جای try-finally از عبارت try-except استفاده کنید - به عنوان مثال، در مثال زیر نشان داده شده است:
رویه TDataModule1.IdTCPServer1Execute(AThread: IdPeerThread); var s: رشته; با AThread.Connection شروع کنید s:= ReadLn را امتحان کنید. // وظیفه سرور را در اینجا انجام دهید // اگر هیچ استثنایی مطرح نشد، // پاسخ سرور را بنویسید WriteLn(s)؛ به جز در e: Exception do begin WriteLn(e.Message); end; //on end; // سعی کنید به جز در نهایت قطع، پایان، پایان.
این مثال کوچک مراحل ایجاد یک سرور متنی ساده و همچنین نحوه اشکال زدایی آن را نشان می دهد.
سروری که در بالا توضیح داده شد یک نمونه معمولی از سازماندهی محاسبات توزیع شده مدرن است.
ویژگی های ایجاد اپلیکیشن های چند لایه
اخیراً چندین سرور به طور فزاینده ای برای برآوردن درخواست های مشتری استفاده می شود. سروری از این نوع، پس از دریافت درخواست مشتری و تا حدی آن را برای پردازش بیشتر آماده می کند، با سرور دیگری تماس می گیرد و درخواست یا درخواست های تبدیل شده را برای آن ارسال می کند. سرور رده دوم به نوبه خود می تواند با سرورهای دیگر ارتباط برقرار کند. بنابراین، ما می توانیم در مورد معماری سرور چند لایه صحبت کنیم.
در مرحله بعد یک سرور دسترسی به داده ایجاد می کنیم که هدف آن برگرداندن داده ها از پایگاه داده است. با این حال، این سرور مستقیماً فایل های پایگاه داده را نمی خواند یا نمی نویسد. در عوض، در جستجوی داده های مورد نیاز مشتری با سرور پایگاه داده ارتباط برقرار می کند.
بنابراین، ما شروع به توسعه یک برنامه با معماری سه لایه می کنیم. برای ایجاد یک سرور پایگاه داده با استفاده از مؤلفه های Indy به موارد زیر نیاز دارید:
- یک پروژه جدید ایجاد کنید.
- بگذار روی فرم اصلینمونه پروژه مولفه TIdTCPServer از پالت Indy Servers.
- ویژگی DefaultPort نمونه کلاس TIdTCPServer1 را روی 6001 تنظیم کنید (توصیه میشود برای جلوگیری از تکرار شماره پورت در برنامههای مختلف، مقادیر بزرگی را اختصاص دهید)، و ویژگی Active را روی true تنظیم کنید.
- با انتخاب File | یک ماژول جدید به پروژه اضافه کنید جدید | ماژول داده، و نمونه هایی از مولفه های SQLConnection و SQLDataSet را از زبانه dbExpress در پالت مؤلفه ها روی آن قرار دهید.
- ویژگی ConnectionName کلاس SQLConnection را روی IBLocal و LoginPrompt را روی False قرار دهید. اگر IBLocal را در پایگاه داده staff.gdb پیکربندی نکرده اید، ابتدا این روش را تکمیل کنید.
سلام به همه!
هنگام توسعه پروژه وب بعدی، این وظیفه پیش آمد - پیاده سازی نرم افزار مشتری در دلفی، که داده ها را با استفاده از روش POST به سرور منتقل می کند. برنامه باید متن را انتقال دهد و فایل ها را به سرور وب آپلود کند.
پیاده سازی چنین ارسال داده ای با استفاده از زبان های سمت سرور توسعه وب(به عنوان مثال، PHP) بسیار ساده است، اما اگر نیاز به نوشتن نرم افزار مبتنی بر برنامه و چند کاربر دارید که با سرور تعامل دارد، کمی پیچیده تر است. روش اتصال مستقیم به پایگاه داده و از طریق FTP به سرور از دلفی دیگر ضروری نیست زیرا ایمن نیست، قابل اعتماد نیست (تغییر رمز عبور، داده های اتصال و غیره) و اضافی ایجاد می کند. مشکلات سازگاری نرم افزار در سمت مشتری برای حل این مشکل تصمیم گرفتم اسکریپت هایی (بخش سرور) در PHP بنویسم که ورودی را پردازش کند درخواست های POSTو نتیجه را به مشتری (برنامه دلفی) برگردانید. مزایای این روش این است که تمام اتصالات و پردازش داده ها بر روی سرور انجام می شود که بسیار ایمن تر از "اتصال" مستقیم است.
زمانی که شروع به گوگل کردم، بسیاری از اطلاعات پراکنده، عمدتاً در انجمن ها، حذف شد، اما همه آن ها تکه تکه بود. یک چیز مسلم بود که Indy مورد استفاده قرار خواهد گرفت، یعنی جزء IdHTTP با روش POST پیاده سازی شده است. در واقع، همه چیز ساده است، این روشدو پارامتر Url یک منبع و DataStream (جریان داده) را می گیرد و نتیجه را به صورت متن برمی گرداند (همچنین می تواند کد HTML صفحه باشد). نکته اصلی شکل گیری صحیح DataStream (جریان داده های ارسال شده) بود، اما در طول راه مشکلات دیگری ظاهر شد، یعنی رمزگذاری روسی (اگر خوب نبود). اینجا بود که سرگرمی برای چندین ساعت سرگردانی در اینترنت شروع شد. به طور کلی، بس است، بیایید به تمرین و پیاده سازی نرم افزار بپردازیم.
بنابراین برنامه ساده است. او باید داده ها را با استفاده از روش POST به سرور ارسال کند، داده ها حاوی " سرفصل "(خط)،" شرح » ( متن چند خطی) و فایل گرافیکی(داده های jpg, png, gif-binary). سرور باید این داده ها را بپذیرد، آنها را پردازش کند، فایل گرافیکی را در سرور ذخیره کند و پاسخی را برگرداند. به عنوان پاسخ، دلفی را به برنامه برمی گردانیم، همان متن را فقط با برچسب های اضافه شده و پیوند به فایل دانلود شده. هیچ چیز دیگر.
بیایید با پیاده سازی قسمت سرور (مشابه API سایت) شروع کنیم. هر کدام را باز کنید ویرایشگر متن(دفتر یادداشت) و کد زیر را در آن بنویسید:
"; ) else ( echo "عنوان: گم شده"."
"; ) //داده های ورودی را برای وجود داده های فیلد "محتوا" بررسی کنید if (!empty($_POST["content"]))( echo "Content: ".$_POST["content"]."
"; ) else (اکوی "محتوا: گم شده"."
"; ) //در صورتی که (!empty($_FILES["file"])) ($finfo = pathinfo($_FILES["file"]["name") دادههای ورودی را برای وجود یک فایل پیوست شده "فایل" بررسی کنید. ])؛ / /دریافت اطلاعات در مورد فایل (نام، پسوند و غیره) //نوع فایل را در لیست انواع مجاز بررسی کنید (IMPROVISATION:)) اگر (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
طرح بندی از اجزای زیر استفاده می کند: برچسب، دکمه (2 عدد)، ویرایش (2 عدد)، یادداشت (2 عدد)، CheckBox، OpenDialog، IdHTTP. نام اجزای زیر را بدهید (ویژگی " نام”):
- ویرایش (عنوان) - نام = عنوان
- ویرایش (مسیر فایل) – نام = imgfile;
- یادداشت (مطالب) – نام = محتوا;
- یادداشت (نتیجه) – نام = پاسخ
- دکمه(…) - نام = chkfile;
- دکمه (POST) - نام = پست اما;
- OpenDialog (گفتگوی انتخاب فایل) – نام = PictDialog;
بیایید IdHTTP1 و CheckBox1 را بدون تغییر بگذاریم (خسته! :)))).
تا به طور تصادفی " ویرایش کنید» مسیر ویرایش( imgfile)، ویژگی ReadOnly آن را روی True قرار دهید. به همین ترتیب، در imgfileو chkfileویژگی Enabled را روی false قرار دهید. ما آنها را با استفاده از CheckBox فعال خواهیم کرد. ما این فرصت را برای انتخاب آپلود یا عدم آپلود تصویر فراهم خواهیم کرد.
برای OpenDialog( PictDialog) باید فیلتر (ویژگی Filter) را به صورت زیر تنظیم کنید:
آماده سازی بصری واقعی به پایان رسیده است! بیایید شروع به کدنویسی کنیم!
در پروژه ما یک جریان داده با استفاده از نوع ارائه شده با Indy ایجاد می کنیم - TidMultiPartFormDataStream.اگرچه ما با گزینه های پیاده سازی با استفاده از TStream مواجه شدیم که با آن کار می کنیم TidMultiPartFormDataStream –آسان تر!
برای در دسترس قرار دادن این نوع برای پروژه خود، باید کتابخانه زیر را به Uses اضافه کنیم: IdMultipartFormData.
برای CheckBox1، یک رویداد OnClick ایجاد کنید (با دوبار کلیک کردن ماوس روی شی) و کد زیر را به این رویداد اضافه کنید:
رویه TForm1.CheckBox1Click(فرستنده: TObject); شروع //فعال یا غیرفعال کردن عناصر مسیر فایل و دکمه های گفتگو imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.Checked; پایان؛
در اینجا ما اشیاء را فعال می کنیم imgfile وchkfileبسته به وجود یک علامت (اگر چک باکس علامت زده شود، اشیاء فعال می شوند).
حالا بیایید انتخاب تصویر را سازماندهی کنیم. برای انجام این کار، روی دکمه یک رویداد OnClick ایجاد کنید chkfile(همچنین با دوبار کلیک کردن روی شی) و موارد زیر را بنویسید:
روش TForm1.chkfileClick(Sender: TObject); شروع //باز کردن گفتگو و وارد کردن مسیر کامل فایل در imgfile(TEdit) اگر PictDialog.Execute سپس imgfile.Text:= PictDialog.FileName; پایان؛
این رویداد یک گفتگوی انتخاب تصویر را راه اندازی می کند و اگر کاربر روی " کلیک کند باز کن"، سپس مسیر این فایل به آن اضافه می شود imgfile.
و اکنون به آخرین دکمه "POST" می رسیم. یک رویداد OnClick برای این دکمه ایجاد کنید و کد زیر را اضافه کنید:
روش TForm1.PostButClick(فرستنده: TObject); var dataPost:TIdMultiPartFormDataStream; start 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,""); //افزودن فیلدی با پاسخ فایل.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost)"
",#13#10,); datapost.Free; end;
بنابراین، به ترتیب (اگرچه نظراتی وجود دارد):
پست داده - شی از نوع TIdMultiPartFormDataStream. به شما امکان می دهد یک ساختار درخواست POST متشکل از فیلدهای مختلف ایجاد کنید.
dataPost . AddFormField (" عنوان ", عنوان . متن ," utf -8 "). انتقال محتوا := " 8 بیت "; - فیلدی به نام "title" را به DataPost اضافه می کند، مقداری از "title.Text"، رمزگذاری داده های ارسالی را روی "utf-8" تنظیم می کند (پارامتر اختیاری است، اما بدون علامت صریح آن، سیریلیک با ارسال می شود. علامت سوال "؟") و یک روش بسیار مهم "انتقال محتوا". بدون این روش، داده ها به سرور ارسال می شود. ابراکادابرا" لطفاً توجه داشته باشید که نام فیلد ("عنوان") در سمت ارسال کننده باید با نام مشخص شده در اسکریپت مطابقت داشته باشد: $_POST["title"].
داده ها به طور مشابه به قسمت "محتوا" منتقل می شوند.
dataPost . AddFile (" فایل ", imgfile . متن ,"") – با این خط یک جریان با داده از فایل ایجاد می کنیم.
تمام است، داده ها تولید می شوند، تنها چیزی که باقی می ماند انتقال آن به اسکریپت روی سرور و دریافت پاسخ است:
answer.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost)"
",#13#10,);
زیرا TMemo برچسب شکست خط را نمی فهمد "
"، از تابع " " برای جایگزینی آن با شکست های قابل فهم "#13#10" استفاده می کنیم.
وقتی همه چیز کامل شد، حافظه را از شی DataPost با خط زیر پاک کنید:
datapost.Free;
اگر چه در مثال ما این به طور خودکار در پایان روش اتفاق می افتد، اما هنوز...
نتیجه واقعی برنامه روی صفحه:
بنابراین، ما می توانیم به اندازه دلخواه داده یا فایل را به سرور ارسال کنیم، این داده ها را روی سرور پردازش کنیم و نتیجه اسکریپت را به برنامه گزارش دهیم. حتی می تواند فقط 0 یا 1 باشد که به برنامه سیگنال می دهد تا بیشتر واکنش نشان دهد.
همه. همگی موفق باشید. امیدوارم اطلاعات مفید بوده باشد و از آن استفاده کنید.
می توانید نمونه و اسکریپت تمام شده را دانلود کنید.
کد ماژول کامل:
واحد PostUnit; اینترفیس از Winapi.Windows، Winapi.Messages، System.SysUtils، System.Variants، System.Classes، Vcl.Graphics، Vcl.Controls، Vcl.Forms، Vcl.Dialogs، Vcl.StdCtrls، IdBaseComponent، IdComponent، IdTCPliction،IdTCPdC استفاده می کند. IdHTTP، IdMultipartFormData، Vcl.ExtDlgs؛ نوع TForm1 = class(TForm) IdHTTP1: TIdHTTP; عنوان: TEdit; مطالب: TMemo; PostBut: TButton; پاسخ: TMemo; Label1: TLabel; Label2: TLabel; Label3: TLabel; imgfile:TEdit; chkfile: TButton; Label4: TLabel; CheckBox1: TCcheckBox; PictDialog:TOpenDialog; رویه PostButClick(فرستنده: TObject); رویه chkfileClick(فرستنده: TObject); روش CheckBox1Click(فرستنده: TObject); private ( Private declarations ) public ( Public declarations ) end; var Form1: TForm1; پیاده سازی ($R *.dfm) رویه TForm1.CheckBox1Click(Sender: TObject); شروع //فعال یا غیرفعال کردن عناصر مسیر فایل و دکمه های گفتگو imgfile.Enabled:=CheckBox1.Checked; chkfile.Enabled:=CheckBox1.Checked; پایان؛ روش TForm1.chkfileClick(فرستنده: TObject); شروع //باز کردن گفتگو و وارد کردن مسیر کامل فایل در imgfile(TEdit) اگر PictDialog.Execute سپس imgfile.Text:= PictDialog.FileName; پایان؛ روش TForm1.PostButClick(فرستنده: TObject); var dataPost:TIdMultiPartFormDataStream; start 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,""); //افزودن فیلدی با پاسخ فایل.Text:= StringReplace(idHTTP1.Post("http://api..php",dataPost)"
",#13#10,); datapost.Free; end; end.