المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : الاتصال بالشبكة بواسطة Udp وتبادل بيانات الاتصال


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

كما يمكن أن أكون قد وقعت في خطأ (سهوا أو قلة معرفة) لذلك أرحب بجميع التعليقات .. فقط علقوا

نبحث دائما عن زيادة المعرفة ثم نكثر من التطبيق حتى نحصل على برنامج مشرف.


تحياتي

merouane
20-03-2008, 09:12 PM
السلام عليكم

حسنا سأكون أول المعلقين والمصححين

أولا:
Label5.Caption = LIP

هي Label5.Name = LIP

ثانيا:
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;

هي في الحقيقة
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');

LHost.Caption := DataStringStream.DataString;
LIP.Caption := ABinding.PeerIP;
end;
finally
DataStringStream.Free;
end;

عفوا و تحياتي :)

S.FATEH
21-03-2008, 03:11 PM
شكرا عزيزي
واصل ابداعك
الدرس في وقته انا ايضا ادرس خصائص هذا الاتصال
سلامي ال الامام

STRELiTZIA
21-03-2008, 05:49 PM
جزاك الله خيرا اخي مروان :)
عندي ملاحظة صغيرة لتسهيل قراءة الــ Components المستعملة في برنامجك و تخص تسمية المكونات و خاصة اذا كبر حجم الــ Code
- تسميتها تربح الوقت.
- و تسهل العمل للمشاركين في التعديلات و الاضافات في حالة مشروع جماعي :D

تحياتي

merouane
21-03-2008, 07:34 PM
شكرا عزيزي
واصل ابداعك
الدرس في وقته انا ايضا ادرس خصائص هذا الاتصال
سلامي ال الامام

العفو ..

سنتقدم جميعا إذا علمنا ماذا نحتاج

أي: الأسئلة ستعرفنا أي الطريق نسلك

تحياتي :)

merouane
21-03-2008, 07:47 PM
جزاك الله خيرا اخي مروان :)
عندي ملاحظة صغيرة لتسهيل قراءة الــ Components المستعملة في برنامجك و تخص تسمية المكونات و خاصة اذا كبر حجم الــ Code
- تسميتها تربح الوقت.
- و تسهل العمل للمشاركين في التعديلات و الاضافات في حالة مشروع جماعي :D

تحياتي

الله ينورك أخي

نعم ملاحظتك في محلها .. لكن - و قد ذكرتها بنفسك - في المشروع الجماعي

و قد اتبعت نصيحة أخونا مهدي هـــنـــــا (http://www.delphi4arab.com/forum/showthread.php?t=92)

ليكون التناسق بين جميع الأعضاء ، و لا توجد مشكلة (نسمي المكونات أو نتركها كما هي) إذا اتفق الأغلبية حول طريقة عرض الدروس

و أنا شخصيا أدعم رأيك لأنه إذا أراد أحدهم التقدم بخطوات ثابتة لا بد من التفكير كمبرمج أو مطور حسب العمل.

تحياتي :)

wesamnet
18-12-2010, 05:18 AM
جزاك الله خيرا على هذا الشرح

WARD.MHM
16-08-2011, 01:57 AM
السلام عليكم . . .
اشكرك على الموضوع
لكن ماذا تقصد بــ " إلا إذا أردت استعمال بعض الإجراء الأساسية ذات المستوى السفلي" ؟

amine0209
03-09-2011, 11:20 AM
أين اجد مكون المستخدم ؟
بحثت في كل التبويبات ولم اجده وانا استعمل delphi 7 second edition

mahboub2011
27-09-2011, 03:02 PM
أين اجد مكون المستخدم ؟
بحثت في كل التبويبات ولم اجده وانا استعمل delphi 7 second edition

يجب عليك ان تحمله وتتبته
في الدلفي 7 لا ياتي الاندي معه

A.FATEH
04-10-2011, 07:01 PM
السلام عليكم ورحمة الله
هاك بعض المشاكل في الكود
1- sender1 غير معرف
2- لا يوجد خاصية localname في server1
استعمل دلفي 7 نسخة الاندي 9

salem
14-11-2011, 04:43 PM
شكرا على الموضوع
نفس الملاحظة مع الأخ a.fateh
1- sender1 غير معرف
2- لا يوجد خاصية localname في server
Server1.Send(ABinding.PeerIP, 8060, Server.LocalName);
استعمل دلفي 7 نسخة الاندي 9

dvb-dz haker
28-11-2011, 03:28 PM
شكرا على الموضوع