عزیزم برای حل این مشکل 3 تا راه پیش روی شماست
1- استفاده از web service
2- استفاده از بانک اطلاعاتی mysql
3- استفاده از ابزار indy
در زیز من واست مثالهایی رو میارم که امیدوارم مشکلت رو حل کنه
with IdTCPServer.Bindings.Add do
begin
IP:='192.168.167.12';
Port:=9999;
end;
with IdTCPClient do begin
Host := '192.168.167.12';
Port := 9999;
Connect;
WriteBuffer(MySendingRecord,SizeOf(MySendingRecord),true);
Disconnect;
end;
اطلاعات کاملتر
http://delphi.about.com/od/internetintra...20403a.htm
وب سرویس چیست؟ مقدمه
--------------------------------------------------------------------------------
یک وب سرویس به معنای ساده نوعی کامپوننت تحت وب است.
این کامپوننت به application هایی که از آن استفاده می کنند این امکان را می دهد که بتوانند از متدهای این وب سرویس استفاده کنند.
بهتر است وب سرویس را با یک مثال توضیح دهیم.
فرض کنید شما می خواهید در web application خود وضعیت آب و هوای مناطق جغرافییای مختلف را داشته باشید. برای پیاده سازی چنین کاری شما دو راه دارید:
1- خودتان وضعیت اب و هوا را از سایت های مختلف جمع آوری کنید و آنها را در web application خود استفاده کنید.
2- از یک وب سرویس که آب و هوای مناطق جغرافیایی مختلف را می دهد استفاده کنید.
در واقع این وب سرویس آب و هوا به تنهایی کاری نمی کند. بلکه توابعی دارد که توسط web application های مختلف صدا زده می شوند. که بعنوان مثال در اینجا وب سرویس وضعیت آب و هوا را برمی گرداند.
البته وب سرویس ها استفاده های بسیار پرکاربردتر و مهمتری دارند مثل کار با دیتابیس و ... که در اینجا فقط یک مثال برای روشن شدن موضوع ذکر شد.
اما مزیت اصلی استفاده از وب سرویسها:
عدم نیاز به کدنویسی مجدد.
شاید بسیاری از دوستانی که OOP کار کارده اند بگویند که اینکار با کلاس هم امکانپذیر است. بله امکانپذیر است اما:
1- در برنامه نویسی با کلاس شما باید کلاستان را در هر پروژه add کنید ولی در وب سرویس فقط کافیست از متدها استفاده کنید.
2- در کار با کلاسها شما ممکن است در application های مختلف به روشهای مختلف با کلاسهای متفاوت کار کنید. یعنی به عبارتی کار شما هر بار متفاوت است و این خوانایی را پایین می آورد و همچنین توسعه را مشکل می سازد. اما در استفاده از وب سرویس شما هربار فقط با یک وب سرویس خاص کار می کنید و طبق همان متدهای خاص وب سرویس کار می کنید حالا در هر کجا و هر application که باشید.
3- وقتی با سرویس کار می کنید یک سری استانداردهایی در استفاده وجود دارد که تمام application ها باید از آن تبعیت کنند و بنابراین reusability بالا می رود.
4- و ....
و اما بعضی واژگان در ارتباط با Web Service :
XML:
Extensible Markup Language
یک زبان markup است که یک فرمتی را برای توصیف داده ها فراهم می کنید. شبیه html است شامل تگ ها و ...
SOAP :
Simple Object Access Protocol
در واقع پروتکل ارتباطی است برای وب سرویس مثل http برای وب و ...
WSDL:
Web Service Description Language
یک xml document برای web service است که متدها و بعضی خصوصیات دیگر وب سرویس را توضیح می دهد.
در این قسمت ایجاد وب سرویس با C# code behind توضیح داده می شود البته با vs 2005 . در vs 2003 نیز بسیار شبیه به 2005 است.
ابتدا به این قسمت بروید :
File -> new -> website
از پنجره نشان داده شده Asp.net Web Service را انتخاب کنید.(شکل 1 )
حال در solution explorer فایلی با نام service.asmx می بینید که فایل اصلی webservice شما است و در واقع از کلاس service.cs که در پوشه ی app_code قرار دارد استفاده می کند.
کلاس service.cs در 2005 یا service.asamx.cs در 2003 از namespace System.Web.Services.WebService مشتق می شود. و دارای متدهایی با تگهای [WebMethod] است. این متدها متهایی هستند که قابل استفاده توسط web application های دیگر هستند.
حال برای نمونه یکبار webservice خود را run کنید. یک صفحه با آدرس http://..../service.asmx در browser نمایش داده می شود.
شکل 2 یک نمونه وب سرویس است با عنوان SSO و متدهایی که در زیرش نشان داده شده.
چگونگی ایجاد وب متد:
نمونه کد زیر را ببینید:
کد:
[WebMethod]
public string HelloWorld() {
return "Hello World";
}وب متدها همانطوری که اشاره شد با تگ [WebMethod] شروع می شوند. و بسته به نیاز می توانند پارامتر بگیرند و خروجی برگردانند.
برای اطلاعات بیشتر در مورد type پارامترها به آدرس زیر مراجعه کنید :
http://samples.gotdotnet.com/quickst...vicetypes.aspx
حال اگر متد بالا را در وب سرویس خود اجرا کنید می بینید که خروجی Hello World را داخل تگ های xml به شما برمی گرداند.
دقت کنید که این نمایش از وب سرویس صرفا یک نمای ایجاد شده توسط مایکروسافت است و شما نمی توانید به اینصورت از وب سرئیس استفاده کنید. بلکه شما برای استفاده نیاز به استفاده از این متد ها در Web application خود دارید.
اما پارامترهایی که در تگ وب متد بکار می روند:
1- Description
همانطوری که از نامش پیداست توضیحات مربوط به هر متد را مشخص می کند که این توضیحات در زیر هر متد در پیش نمایش و همچنین در فایل WSDL مربوط به وب سرویس قابل مشاهده است.
2- EnableSession
همانطوریک از نامش پیداست برای مدیریت Session ها بکار می رود.
این متغیر در ابتدا Disable است که شما می توانید آنرا به Enable تغییر دهید.
البته پیشنهاد می شود که اگر نیاز به استفاده از این امکان ندارید آنرا Disable بگذارید تا Performance کاهش نیابد.
3-CacheDuration
تعداد ثانیه هایی که یک response کش می شود.در حالت عادی صفر است یعنی response کش نمی شود.
TransactionOption4-
مدیریت تراکنش ها. در مورد تراکنش ها دوستان احتمالا اطلاعاتی دارند.
یک تراکنش مجموعه ای از دستورات است که یا همه با هم اجرا می شود و یا هیچکدام انجام نمی شود. مورد استفاده ی این تراکنش ها بیشتر در کارت های اعتباری و ...
بحث بیشتر در مورد تراکنش ها ما را از حوزه ی وب سرویس خارج می کند.
5- BufferedResponse
وب سرویس بصورت پیش فرض Response را بافر می کند و هرزمان بافر پر شد دوباره خالی می شود و ادامه می دهد. اما گاهی شاید شما در کار خودتان دیتاهای بزرگ و response بزرگی داشته باشید که بافرشدن آن کارایی را پایین بیاورد در چنین شرایطی شما می توانید این گزینه را false کنید .
استفاده از یک وب سرویس در web application (Consuming webservice)
--------------------------------------------------------------------------------
در قسمت قبل طریقه ی ایجاد یک وب سرویس را گفتیم. اما گفتیم که وب سرویس به تنهایی نمی تواند توسط کاربر استفاده شود بلکه باید یک web application آنرا Consume (استفاده) کند.
حال یک web application ایجاد کنید.
روی پروژه راست کلیک کنید و گزینه ی Add web reference را انتخاب کنید. پنجره ای مطابق با شکل 1 ظاهر می شود.
اگر url وب سرویس را به شما داده باشند آنرا در قسمت url وارد کنید. و اگر که از روی localmachine بخواهید وب سرویس را جستجو کنید داخل همین پنجره گزینه ای برای آن وجود دارد. پس از انتخاب url وب سرویس یک نام به آن نسبت دهید این نام در واقع نام کلاسی است با عنوان prxoy class که برای ارتباط با وب سرویس از طریق برنامه ی شما بکار می رود.
حال شما می توانید از متدهای وب سرویس خود در برنامه استفاده کنید.
این کد یک نمونه برای مثال است :
کد:
private SSO.SSO sso = new WebLoginControl.SSO.SSO();
UserId_int=sso.get_user_id(UserName_txt.Text,Password_txt.Text);
پس از یادگیری نحوه ی کار با وب سرویس ها اکنون بهترین زمان برای درک مفهوم پیشرفته و بسیار زیبای SOA است.
با یک مثال شروع می کنیم:
فرض کنید شما در حال نوشتن یک Web application برای مدیریت مسایل مالی هستید.
در برنامه نویسی oop و یا چندلایه شما ابتدا پروژه را به چند لایه برای ارتباط با دیتابیس و business لایه و ... می شکنید و بعد شروع به کار میکنید.
حال SOA چه می گوید:
SOA که مخفف Service Oriented Architecture است به شما راهکاری برای متمایز کردن هر یک از این کارها در سرویس ها یا همان وب سرویس های مجزا می دهد. یعنی شما یک وب سرویس برای کار با دیتابیس. یک وب سرویس برای بعنوان مثال کارهای validation و... دارید و در برنماه ی خود از این وب سرویس ها استفاده می کنید.
در این حالت شما امکان استفاده بارها و بارها از وب سرویس خود را دارید .
در واقع SOA یک متد تقریبا جدید در توسعه نرم افزار است. و گفته شده تا سال 2008 بیش از 80 درصد پروژه های نرم افزاری از این متد استفاده خواهند کرد.
اما چرا SOA :
- فهمیدن بهتر سیستم
- سازماندهی بهتر – تمرکز بیشتر روی توسعه ها
- یکپارچه سازی ساده تر بین سیستم ها
- بهتر شدن محدوده ی تست ها
- Reusability بیشتر و بالاتر
- افزایش قابلیت اعتماد
- توسعه و develop فقط روی business plan متمرکز می شود.
- و...
برای آشنایی بیشتر با SOA :
http://msdn.microsoft.com/architectu...tml/aj1soa.asp
همانطوریکه گفته شد SOAP ساختاری را برای ارسال داده ها و پیام ها بین وب سرویس و Web application ایجاد می کند.
اما یک مشکل اینجا وجود دارد که با یک مثال توضیح داده شده است:
شما ممکن است یک کلمه انگلیسی را بشنوید که در زبان کشور USA یک معنا بدهد و در زبان کشور UK معنای دیگر.
دقیقا همین مشکل ممکن است در هنگام استفاده از وب سرویس اتفاق بیافتد. در واقع شما باید type و شکل message های ایجاد شده توسط وب متد ها را مشخص کنید تا استفاده کننده بداند که چطور باید آنها را معنا کند. این امکان توسط Schema فراهم می شود.
به دو راه می توانید برای وب سرویس خود schema ایجاد کنید:
- بصورت جدا در یک text editor (explicit)
- بصورت استفاده از تگ ها داخل وب سرویس (implicit)
در اینجا توضیح مربوط به Element ها و attribute ها را ارائه نمی کنم چون مربوط به بحث Xml می شود.دوستان برای مطالعه در این زمینه به مقالت xml مراجعه کنند.
اما این یک کلاس ایجاد شده توسط تگ ها بصورت implicit است:
کد:
[XmlRoot(“ServiceRequest”, Namespace=
“urn-SampleSolution-Data”, IsNullable=false)]
[XmlType(“ServiceRequest”, Namespace=
“urn-SampleSolution-Data”)]
public class ServiceRequest
{
#region Fields
private string ticketNumber;
private string accountNumber;
private string accountName;
private string serviceNotes;
private string priority;
private string contactMethod;
private System.DateTime requestOpened;
private int hrEmployeeId;
private bool hrEmployeeIdSpecified;
private string assignTo;
private System.DateTime requestClosed;
private bool requestClosedSpecified;
private string resolutionNotes;
#endregion
#region Serializable Properties
[XmlElement]
public string TicketNumber
{
get { return this.ticketNumber; }
set { this.ticketNumber = value; }
}
[XmlElement]
public string AccountNumber
{
get { return this.accountNumber; }
set { this.accountNumber = value; }
}
[XmlElement]
public string AccountName
{
get { return this.accountName; }
set { this.accountName = value; }
}
[XmlElement]
public string ServiceNotes
{
get { return this.serviceNotes; }
set { this.serviceNotes = value; }
}
[XmlElement]
public string Priority
{
get { return this.priority; }
set { this.priority = value; }
}
[XmlElement]
public string ContactMethod
{
get { return this.contactMethod; }
set { this.contactMethod = value; }
}
[XmlElement]
public System.DateTime RequestOpened
{
get { return this.requestOpened; }
set { this.requestOpened = value; }
}
[XmlElement]
public int HREmployeeId
{
get { return this.hrEmployeeId; }
set
{
this.hrEmployeeId = value;
this.HREmployeeIdSpecified = true;
}
}
[XmlIgnore()]
public bool HREmployeeIdSpecified
{
get { return this.hrEmployeeIdSpecified; }
set { this.hrEmployeeIdSpecified = value; }
}
[XmlElement]
public string AssignTo
{
get { return this.assignTo; }
set { this.assignTo = value; }
}
[XmlElement]
public System.DateTime RequestClosed
{
get { return this.requestClosed; }
set
{
this.requestClosed = value;
this.RequestClosedSpecified = true;
}
}
[XmlIgnore()]
public bool RequestClosedSpecified
{
get { return this.requestClosedSpecified; }
set { this.requestClosedSpecified = value; }
}
[XmlElement]
public string ResolutionNotes
{
get { return this.resolutionNotes; }
set { this.resolutionNotes = value; }
}
#endregion
}
دوستان توجه کنند که تگ هایی که برای اینکار استفاده می شود در زیر آورده شده است:
[XmlElement]
[XmlElement(ElementName="Album")] تعریف element
[ return: XmlElement("SubmissionReceipt")] بازگشتی به شکل element
[XmlAttribute]
[XmlAttribute(AttributeName="noOfTracks", DataType="unsignedByte")]
[XmlText]
...
فراخوانی وب سرویس ها بطور دینامیک Calling Dynamically WebServices
--------------------------------------------------------------------------------
تا اینجا راههایی که ما برای فراخوانی وب سرویس بررسی کردیم به اینصورت بود که شما حتما باید مشخصات وب سرویس ها رو هنگام تولید کد برنامه داشته باشید تا بتونید prxoy Class رو براشون ایجاد کنید یعنی Add web reference اش کنید و بعدا ازش استفاده کنید.
اما یک خصوصیت خیلی مهم وب سرویس ها اینه که تعدادشون هر روز زیاد تر میشه و وب سرویس های بهتر و بیشتر بوجود میاد.
حالا اگر شما بخواهید هر بار که وب سرویس تازه ای میاد داخل کد برنامه تغییرات بدین خیلی کار طاقت فرسایی میشه.
یک راه حل خوب برای اینکار استفاده از وب سرویس ها بطور دینامیک است.
یعنی شما هنگام تولید کد prxoy class رو ایجاد نمی کنید.بلکه اینکار رو RunTime انجام می دید.
من یک مقاله در این خصوص پیدا کردم که بسیار عالی هست .
در این مقاله از خصوصیت namespace Codedom و ... برای پیدا کردن متدها ی وب سرویس ها بطور دینامیک استفاده شده و...
توصیه می کنم حتما مطالعه کنید.
http://msdn2.microsoft.com/en-us/lib...35(vs.80).aspx
دانلود مقاله بالا به صورت pdf
http://barnamenevis.org/forum/attachment...1152430906
با تشکر از انجمن برنامه نویس و دوست خوبمون reza_rad