merouane
20-03-2008, 05:38 AM
السلام عليكم و رحمة الله تعالى وبركاته
أحببت أن أواصل ما قدمته في مشروع برنامج محادثة (المشاريع الجماعية) لأقدم درسا بسيطا عن برمجة الشبكات عبر اللغة الجميلة دلفي
(أعلم و أحذركم أنني ضعيف في ميدان الشروحات )،
ولكي يحصل القارئ على أكبر قدر من الفهم لا بد له من أمرين : الــتــطــبــيــق – الــســؤال عن ما أشكل
و العمل المهم بعد قراءة هذا الدرس البسيط هو الذهاب إلى الموارد الرئيسية أي كل ما صدر عن الشركات الأم و المطور الأساسي
أولا نبدأ بتعريف الشبكات بنظرة عامة وبسيطة:
الشبكة في المعلوماتية ما هي سوى ربط بين جهازين – أو أكثر – من الحواسيب، مثل الشبكة الهاتفية تجمع العديد من الناس،
ومثل الطرق الرئيسية تجمع العديد من المدن ...
و عندما يكون جهازين على اتصال (لا يهم طريقة الاتصال) نقول عنهم أنهما " ضمن الشبكة " أو " متصلين ".
و الشبكة المعلوماتية مثلها مثل أي شبكة أخرى من نوع آخر، مثلا الشبكة الإدارية هي محددة بالآتي:
من سيكون في الطرف (الشخص المعنوي أو الحقيقي)
كيف سيتم التخاطب (البروتوكول المتبع) وكم المدة المحددة للتخاطب
من المسؤول بين المتخاطبين
لمن نعطي الأولوية للتخاطب
كم عدد المشتركين في عملية تخاطب (مثلا اجتماع)
ما هو شكل الشبكة لكي تصل المعلومة من أصغر موظف حتى الهيئة العليا
هذه نبذة عن مفهوم الشبكة – فقط للذين يبرمجون بلغة الدلفي وليسوا معلوماتيين –
و الشبكات أنوع منها المحلية (LAN) و شبكة ذات المساحة الواسعة (WAN) و الشبكات المتصلة ببعضها (Inter Net)
نموذج ISO) International Standards Organisation)
طُور بين 1977 و 1984 وهو غالبا ما يستعمل كقاعدة أو أساس لتوصيل المعلومات بين الحواسيب المتصلة خاصة الاتصال من نوع TCP/IP
العنوان IP) Internet Protocol) و هو الرقم المعرف لكل حاسوب داخل الشبكة والذي نراه بالشكل 192.168.1.27
طرق نقل المعلومات:
سأذكر طريقتين هما الأهم في عالم الأنترنت و كذلك المراد من هذا المقال
TCP) Transmission Control Protocol) : و هو البروتوكول الخاص بعمليات النقل الموثقة (أي المتابعة)
من ويكيبيديا : أهم ميزات الـ TCP هي ضمان إرسال الحزم إلى المستقبل كاملة بدون نقص أو فقدان ،
وأيضا يقوم هذا البرتوكول برسم خط الذهاب والعودة للحزم من المرسل إلى المستقبل والعكس
UDP) User Datagram Protocol) : و هو البروتوكل همه الوحيد توصيل المعلومة "بسرعة"دون التحقق من الوجهة أو الضمان
( وهذا ما سأستعمله لاحقا) وهذا البروتوكول شائع الاستعمال في برامج النشر مثل التلفاز و الراديو على الأنترنت وحتى برامج المحادثة.
من ويكيبيديا: و بروتوكول يسمح بتناقل البيانات مثل TCP مع بعض الاختلافات الجوهرية من حيث طريقة التوصيل والتأكد من صحة المعلومات و سرعة التوصيل و احتمال الضياع.
الآن نذهب إلى البرمجة (لا أظن المنتدى سيغلق الباب أمام السؤال عن الشبكات لغاية البرمجة ضمن دلفي)
أول شيء لا بد لنا أن ندركه هو نظام التشغيل لأن الإتصال سيمر عبره و هو الوسيط بين التطبيق و الأجهزة الإلكترونية مثل بطاقة الشبكة.
فنظام التشغيل (مثل الويندوز) يوفر لنا Socket التي يتم عبرها الاتصال بالشبكة، و هي توفر للمبرمج سهولة و يسر لإخراج برنامج إلى الحياة . و WinSock عبارة عن API التي تزودنا بالإجراءات لاستعمال بروتوكولات الشبكة.
أما من الناحية البرمجية فيوجد مكونات تسهل اكثر التعامل مع الشبكات (كما يمكننا استعمال WinSock مباشرة – إلا أنه حل بالنسبة لي
غير مرحب به، فالمكونات مثل indy طورها مجموعة من المهندسين و أفرغوا لها وقتهم فأين أنا الوحيد البسيط ضمن المجموعة المثقفة
ذات الإمكانيات، إلا إذا أردت استعمال بعض الإجراء الأساسية ذات المستوى السفلي)
لغة البرمجة دلفي (القوية) و من خلال indy توفر لنا التعامل بكل بساطة وقوة و ربح وقت لبرمجة تطبيقات أو خدمات شبكية سريعة وثابتة
ربما يتقدم أحد الأخوة في المنتدى من لهم خبرة اكثر مني في الشرح و التعامل مع indy أن يتقدموا بالشرح مع بعض الأمثلة.
الآن وبعد الانتهاء من الأساسيات ننتقل إلى المطلوب.. مثال عن إرسال و استقبال عن طريق UDP دون معرفة الطرف الآخر
ثم استخلاص البيانات المطلوبة لربط آمن و موثوق.
سوف نستعمل دلفي 7 (بالنسبة لي أستعمل Delphi 7 Entreprise FR) و indy 9
نشغل الدلفي وننشئ تطبيق جديد (دائما احفظ مشروعك في مجلد عملك)
نسمي المشروع Client
أولا بالنسبة لظهور المعلومات لست بحاجة سوى إلى خمسة من نوع Label ليظهر منهم معلومات السرفر (المتصل الثاني)
أسماوهم كالتالي (سأسميهم حتى يكون الفهم أحسن)
Label1.Caption = Infos Serveur / Infos Server
Label2.Caption = Host Name / Nom de serveur :
Label3.Name = LHost
Label3.Caption = ‘’
Label4.Caption = IP
Label5.Caption = LIP
Label5.Caption = ‘’
بالطبع لا داعي لإدخالها برمجيا وإنما نستعمل جدول الخصائص
http://up103.arabsh.com/files/8zkfiwd72mo8ccyragth.gif
ثم نضيف TMemo الذي سوف نظهر فيه ساعة و تعريف المتصل، ونعطي Align قيمة alRight
و نمسح جميع سطور Lines
ثم نضيف TButton التي بواسطتها سنقوم بالبحث (كما في المستقبل نستطيع جعلها أوتوماتيكية – ذكية)
نغير قيمة Caption إلى ‘Chercher / Find’
بالنسبة لوسائل الاتصال نذهب إلى طرف أين توجد مكونات indy
http://up101.arabsh.com/my/1cc5697.gif
في الأخير سيكون لدينا هذه النافذة البسيطة
http://up103.arabsh.com/files/8d8587h3vzldijvu9op0.gif
الآن العمل الأهم
حدد IdUDPClient و اذهب إلى الخصائص
http://up103.arabsh.com/files/pcb59jk1ua4epekurgdl.gif
سنختار 8060 بالنسبة للـ port و يمكن التغيير فيه فقط احذر من المخصصة مسبقا لنوع معين من الشبكات
من المهم أن نعلم ان BroadcastEnabled هي الخاصية التي ستسمح بعملية النشر لذلك هي True
للبقاء في نفس التسلسل لن ننتقل إلى المكون الآخر سنبقى قليلا مع Client1
نذهب للزر الموضوع سابقا في النافذة و ننقر عليه مرتين
عند ظهور نافذة الشيفرة البرمجية نكتب ما يلي:
Client1.Send('255.255.255.255',8060,'OServer');
هنا استعملنا البعث عن طريق مستقبل 255.255.255.255 (IP) عبر المنفذ 8060 و أرسالنا النص OServer
IP : 255.255.255.255 هو العنوان المخصص للنشر وهو صحيح (أي يعمل) فقط إذا كان المستقبل من الشكل النشر BroadcastEnabled = True
الآن نذهب إلى نافذة برنامجنا و نحدد IdUDPServer و ننتقل إلى الخصائص
http://up101.arabsh.com/my/45d5f56.gif
لاحظ أن الكل (Tous / All) أخذت العنوان 0.0.0.0
ثم ندهب لخانة Evenment و نضغط مرتين على onUDPRead
بعد ظهور نافذة شيفرة البرمجة نكتب ما يلي:
قبل البداية Begin
var DataStringStream: TStringStream;
بعد Begin
DataStringStream := TStringStream.Create('');
try
DataStringStream.CopyFrom(AData, AData.Size);
if DataStringStream.DataString = 'OServer' then
begin
ShowMessage('Reçu : "' + DataStringStream.DataString + '" De : ' + ABinding.PeerIP
+' sur le port : ' + IntToStr(ABinding.PeerPort));
Server1.Send(ABinding.PeerIP, 8060, Server.LocalName);
Memo1.Lines.Add(Datetostr(Now)+' >>> ' + ABinding.PeerIP +' : +DataStringStream.DataString);
end
else
begin
ShowMessage('Serveur est trouver / Server has find');
Label1.Caption := DataStringStream.DataString;
Label2.Caption := ABinding.PeerIP;
end;
finally
DataStringStream.Free;
end;
ثم توجه إلى أعلى حيث uses و أضف IdSocketHandle
هنا نكون قد انتهينا من البرمجة و البرنامج .. على بركة الله
ألم تلاحظوا شيئا
Client1.Send('255.255.255.255',8060,'OServer');
و
Server1.Send(ABinding.PeerIP, 8060, Server.LocalName);
أليستا نفس العملية، إذا و بعد أن فهمنا أن هناك مرسل ومستقبل سنرتفع درجة
نرجع إلى إجراء الزر ليصبح
Sender1.Send('255.255.255.255',8060,'OServer');
ثم نحذف المكون IdUDPClient
و لكي تعرفوا عجلتي لم ألاحظ أول وهلة حتى بدأت بهذا الدرس البسيط .. فشكرا لكم
بعد كل ما مر ، على القارئ أن يجري بنفسه ربط من نوع TCP/IP
كما يمكن أن أكون قد وقعت في خطأ (سهوا أو قلة معرفة) لذلك أرحب بجميع التعليقات .. فقط علقوا
نبحث دائما عن زيادة المعرفة ثم نكثر من التطبيق حتى نحصل على برنامج مشرف.
تحياتي
أحببت أن أواصل ما قدمته في مشروع برنامج محادثة (المشاريع الجماعية) لأقدم درسا بسيطا عن برمجة الشبكات عبر اللغة الجميلة دلفي
(أعلم و أحذركم أنني ضعيف في ميدان الشروحات )،
ولكي يحصل القارئ على أكبر قدر من الفهم لا بد له من أمرين : الــتــطــبــيــق – الــســؤال عن ما أشكل
و العمل المهم بعد قراءة هذا الدرس البسيط هو الذهاب إلى الموارد الرئيسية أي كل ما صدر عن الشركات الأم و المطور الأساسي
أولا نبدأ بتعريف الشبكات بنظرة عامة وبسيطة:
الشبكة في المعلوماتية ما هي سوى ربط بين جهازين – أو أكثر – من الحواسيب، مثل الشبكة الهاتفية تجمع العديد من الناس،
ومثل الطرق الرئيسية تجمع العديد من المدن ...
و عندما يكون جهازين على اتصال (لا يهم طريقة الاتصال) نقول عنهم أنهما " ضمن الشبكة " أو " متصلين ".
و الشبكة المعلوماتية مثلها مثل أي شبكة أخرى من نوع آخر، مثلا الشبكة الإدارية هي محددة بالآتي:
من سيكون في الطرف (الشخص المعنوي أو الحقيقي)
كيف سيتم التخاطب (البروتوكول المتبع) وكم المدة المحددة للتخاطب
من المسؤول بين المتخاطبين
لمن نعطي الأولوية للتخاطب
كم عدد المشتركين في عملية تخاطب (مثلا اجتماع)
ما هو شكل الشبكة لكي تصل المعلومة من أصغر موظف حتى الهيئة العليا
هذه نبذة عن مفهوم الشبكة – فقط للذين يبرمجون بلغة الدلفي وليسوا معلوماتيين –
و الشبكات أنوع منها المحلية (LAN) و شبكة ذات المساحة الواسعة (WAN) و الشبكات المتصلة ببعضها (Inter Net)
نموذج ISO) International Standards Organisation)
طُور بين 1977 و 1984 وهو غالبا ما يستعمل كقاعدة أو أساس لتوصيل المعلومات بين الحواسيب المتصلة خاصة الاتصال من نوع TCP/IP
العنوان IP) Internet Protocol) و هو الرقم المعرف لكل حاسوب داخل الشبكة والذي نراه بالشكل 192.168.1.27
طرق نقل المعلومات:
سأذكر طريقتين هما الأهم في عالم الأنترنت و كذلك المراد من هذا المقال
TCP) Transmission Control Protocol) : و هو البروتوكول الخاص بعمليات النقل الموثقة (أي المتابعة)
من ويكيبيديا : أهم ميزات الـ TCP هي ضمان إرسال الحزم إلى المستقبل كاملة بدون نقص أو فقدان ،
وأيضا يقوم هذا البرتوكول برسم خط الذهاب والعودة للحزم من المرسل إلى المستقبل والعكس
UDP) User Datagram Protocol) : و هو البروتوكل همه الوحيد توصيل المعلومة "بسرعة"دون التحقق من الوجهة أو الضمان
( وهذا ما سأستعمله لاحقا) وهذا البروتوكول شائع الاستعمال في برامج النشر مثل التلفاز و الراديو على الأنترنت وحتى برامج المحادثة.
من ويكيبيديا: و بروتوكول يسمح بتناقل البيانات مثل TCP مع بعض الاختلافات الجوهرية من حيث طريقة التوصيل والتأكد من صحة المعلومات و سرعة التوصيل و احتمال الضياع.
الآن نذهب إلى البرمجة (لا أظن المنتدى سيغلق الباب أمام السؤال عن الشبكات لغاية البرمجة ضمن دلفي)
أول شيء لا بد لنا أن ندركه هو نظام التشغيل لأن الإتصال سيمر عبره و هو الوسيط بين التطبيق و الأجهزة الإلكترونية مثل بطاقة الشبكة.
فنظام التشغيل (مثل الويندوز) يوفر لنا Socket التي يتم عبرها الاتصال بالشبكة، و هي توفر للمبرمج سهولة و يسر لإخراج برنامج إلى الحياة . و WinSock عبارة عن API التي تزودنا بالإجراءات لاستعمال بروتوكولات الشبكة.
أما من الناحية البرمجية فيوجد مكونات تسهل اكثر التعامل مع الشبكات (كما يمكننا استعمال WinSock مباشرة – إلا أنه حل بالنسبة لي
غير مرحب به، فالمكونات مثل indy طورها مجموعة من المهندسين و أفرغوا لها وقتهم فأين أنا الوحيد البسيط ضمن المجموعة المثقفة
ذات الإمكانيات، إلا إذا أردت استعمال بعض الإجراء الأساسية ذات المستوى السفلي)
لغة البرمجة دلفي (القوية) و من خلال indy توفر لنا التعامل بكل بساطة وقوة و ربح وقت لبرمجة تطبيقات أو خدمات شبكية سريعة وثابتة
ربما يتقدم أحد الأخوة في المنتدى من لهم خبرة اكثر مني في الشرح و التعامل مع indy أن يتقدموا بالشرح مع بعض الأمثلة.
الآن وبعد الانتهاء من الأساسيات ننتقل إلى المطلوب.. مثال عن إرسال و استقبال عن طريق UDP دون معرفة الطرف الآخر
ثم استخلاص البيانات المطلوبة لربط آمن و موثوق.
سوف نستعمل دلفي 7 (بالنسبة لي أستعمل Delphi 7 Entreprise FR) و indy 9
نشغل الدلفي وننشئ تطبيق جديد (دائما احفظ مشروعك في مجلد عملك)
نسمي المشروع Client
أولا بالنسبة لظهور المعلومات لست بحاجة سوى إلى خمسة من نوع Label ليظهر منهم معلومات السرفر (المتصل الثاني)
أسماوهم كالتالي (سأسميهم حتى يكون الفهم أحسن)
Label1.Caption = Infos Serveur / Infos Server
Label2.Caption = Host Name / Nom de serveur :
Label3.Name = LHost
Label3.Caption = ‘’
Label4.Caption = IP
Label5.Caption = LIP
Label5.Caption = ‘’
بالطبع لا داعي لإدخالها برمجيا وإنما نستعمل جدول الخصائص
http://up103.arabsh.com/files/8zkfiwd72mo8ccyragth.gif
ثم نضيف TMemo الذي سوف نظهر فيه ساعة و تعريف المتصل، ونعطي Align قيمة alRight
و نمسح جميع سطور Lines
ثم نضيف TButton التي بواسطتها سنقوم بالبحث (كما في المستقبل نستطيع جعلها أوتوماتيكية – ذكية)
نغير قيمة Caption إلى ‘Chercher / Find’
بالنسبة لوسائل الاتصال نذهب إلى طرف أين توجد مكونات indy
http://up101.arabsh.com/my/1cc5697.gif
في الأخير سيكون لدينا هذه النافذة البسيطة
http://up103.arabsh.com/files/8d8587h3vzldijvu9op0.gif
الآن العمل الأهم
حدد IdUDPClient و اذهب إلى الخصائص
http://up103.arabsh.com/files/pcb59jk1ua4epekurgdl.gif
سنختار 8060 بالنسبة للـ port و يمكن التغيير فيه فقط احذر من المخصصة مسبقا لنوع معين من الشبكات
من المهم أن نعلم ان BroadcastEnabled هي الخاصية التي ستسمح بعملية النشر لذلك هي True
للبقاء في نفس التسلسل لن ننتقل إلى المكون الآخر سنبقى قليلا مع Client1
نذهب للزر الموضوع سابقا في النافذة و ننقر عليه مرتين
عند ظهور نافذة الشيفرة البرمجية نكتب ما يلي:
Client1.Send('255.255.255.255',8060,'OServer');
هنا استعملنا البعث عن طريق مستقبل 255.255.255.255 (IP) عبر المنفذ 8060 و أرسالنا النص OServer
IP : 255.255.255.255 هو العنوان المخصص للنشر وهو صحيح (أي يعمل) فقط إذا كان المستقبل من الشكل النشر BroadcastEnabled = True
الآن نذهب إلى نافذة برنامجنا و نحدد IdUDPServer و ننتقل إلى الخصائص
http://up101.arabsh.com/my/45d5f56.gif
لاحظ أن الكل (Tous / All) أخذت العنوان 0.0.0.0
ثم ندهب لخانة Evenment و نضغط مرتين على onUDPRead
بعد ظهور نافذة شيفرة البرمجة نكتب ما يلي:
قبل البداية Begin
var DataStringStream: TStringStream;
بعد Begin
DataStringStream := TStringStream.Create('');
try
DataStringStream.CopyFrom(AData, AData.Size);
if DataStringStream.DataString = 'OServer' then
begin
ShowMessage('Reçu : "' + DataStringStream.DataString + '" De : ' + ABinding.PeerIP
+' sur le port : ' + IntToStr(ABinding.PeerPort));
Server1.Send(ABinding.PeerIP, 8060, Server.LocalName);
Memo1.Lines.Add(Datetostr(Now)+' >>> ' + ABinding.PeerIP +' : +DataStringStream.DataString);
end
else
begin
ShowMessage('Serveur est trouver / Server has find');
Label1.Caption := DataStringStream.DataString;
Label2.Caption := ABinding.PeerIP;
end;
finally
DataStringStream.Free;
end;
ثم توجه إلى أعلى حيث uses و أضف IdSocketHandle
هنا نكون قد انتهينا من البرمجة و البرنامج .. على بركة الله
ألم تلاحظوا شيئا
Client1.Send('255.255.255.255',8060,'OServer');
و
Server1.Send(ABinding.PeerIP, 8060, Server.LocalName);
أليستا نفس العملية، إذا و بعد أن فهمنا أن هناك مرسل ومستقبل سنرتفع درجة
نرجع إلى إجراء الزر ليصبح
Sender1.Send('255.255.255.255',8060,'OServer');
ثم نحذف المكون IdUDPClient
و لكي تعرفوا عجلتي لم ألاحظ أول وهلة حتى بدأت بهذا الدرس البسيط .. فشكرا لكم
بعد كل ما مر ، على القارئ أن يجري بنفسه ربط من نوع TCP/IP
كما يمكن أن أكون قد وقعت في خطأ (سهوا أو قلة معرفة) لذلك أرحب بجميع التعليقات .. فقط علقوا
نبحث دائما عن زيادة المعرفة ثم نكثر من التطبيق حتى نحصل على برنامج مشرف.
تحياتي