delphi4arab منتديات دلفي للعرب

نسخة كاملة : الاتصال بالشبكة بواسطة Udp وتبادل بيانات الاتصال
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2
السلام عليكم و رحمة الله تعالى وبركاته

أحببت أن أواصل ما قدمته في مشروع برنامج محادثة (المشاريع الجماعية) لأقدم درسا بسيطا عن برمجة الشبكات عبر اللغة الجميلة دلفي
(أعلم و أحذركم أنني ضعيف في ميدان الشروحات )،
ولكي يحصل القارئ على أكبر قدر من الفهم لا بد له من أمرين : الــتــطــبــيــق – الــســؤال عن ما أشكل

و العمل المهم بعد قراءة هذا الدرس البسيط هو الذهاب إلى الموارد الرئيسية أي كل ما صدر عن الشركات الأم و المطور الأساسي

أولا نبدأ بتعريف الشبكات بنظرة عامة وبسيطة:
الشبكة في المعلوماتية ما هي سوى ربط بين جهازين – أو أكثر – من الحواسيب، مثل الشبكة الهاتفية تجمع العديد من الناس،
ومثل الطرق الرئيسية تجمع العديد من المدن ...
و عندما يكون جهازين على اتصال (لا يهم طريقة الاتصال) نقول عنهم أنهما " ضمن الشبكة " أو " متصلين ".
و الشبكة المعلوماتية مثلها مثل أي شبكة أخرى من نوع آخر، مثلا الشبكة الإدارية هي محددة بالآتي:
من سيكون في الطرف (الشخص المعنوي أو الحقيقي)
كيف سيتم التخاطب (البروتوكول المتبع) وكم المدة المحددة للتخاطب
من المسؤول بين المتخاطبين
لمن نعطي الأولوية للتخاطب
كم عدد المشتركين في عملية تخاطب (مثلا اجتماع)
ما هو شكل الشبكة لكي تصل المعلومة من أصغر موظف حتى الهيئة العليا

هذه نبذة عن مفهوم الشبكة – فقط للذين يبرمجون بلغة الدلفي وليسوا معلوماتيين –
و الشبكات أنوع منها المحلية (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 ليظهر منهم معلومات السرفر (المتصل الثاني)

أسماوهم كالتالي (سأسميهم حتى يكون الفهم أحسن)
[INDENT]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 = ‘’[/INDENT]
بالطبع لا داعي لإدخالها برمجيا وإنما نستعمل جدول الخصائص

[صورة مرفقة: 8zkfiwd72mo8ccyragth.gif]

ثم نضيف TMemo الذي سوف نظهر فيه ساعة و تعريف المتصل، ونعطي Align قيمة alRight
و نمسح جميع سطور Lines

ثم نضيف TButton التي بواسطتها سنقوم بالبحث (كما في المستقبل نستطيع جعلها أوتوماتيكية – ذكية)
نغير قيمة Caption إلى ‘Chercher / Find’

بالنسبة لوسائل الاتصال نذهب إلى طرف أين توجد مكونات indy

[صورة مرفقة: 1cc5697.gif]

في الأخير سيكون لدينا هذه النافذة البسيطة

[صورة مرفقة: 8d8587h3vzldijvu9op0.gif]

الآن العمل الأهم

حدد IdUDPClient و اذهب إلى الخصائص

[صورة مرفقة: 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 و ننتقل إلى الخصائص

[صورة مرفقة: 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

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

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

تحياتي
السلام عليكم

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

أولا:
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);

      [color=Blue]  Memo1.Lines.Add(Datetostr(Now)+' >>> ' + ABinding.PeerIP +' : +DataStringStream.DataString);[/color]
      end
     else
      begin
        ShowMessage('Serveur est trouver / Server has find');

      [COLOR=Blue]  Label1.Caption := DataStringStream.DataString;
        Label2.Caption := ABinding.PeerIP;[/COLOR]
      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);

      [color=Blue]  Memo1.Lines.Add(Datetostr(Now)+' >>> ' + ABinding.PeerIP +' :  '+DataStringStream.DataString);[/color]
      end
     else
      begin
        ShowMessage('Serveur est trouver / Server has find');
[COLOR=Blue]
        LHost.Caption := DataStringStream.DataString;
        LIP.Caption := ABinding.PeerIP;[/COLOR]
      end;
  finally
      DataStringStream.Free;
  end;

عفوا و تحياتي Smile
شكرا عزيزي
واصل ابداعك
الدرس في وقته انا ايضا ادرس خصائص هذا الاتصال
سلامي ال الامام
جزاك الله خيرا اخي مروان Smile
عندي ملاحظة صغيرة لتسهيل قراءة الــ Components المستعملة في برنامجك و تخص تسمية المكونات و خاصة اذا كبر حجم الــ Code
- تسميتها تربح الوقت.
- و تسهل العمل للمشاركين في التعديلات و الاضافات في حالة مشروع جماعي Big Grin

تحياتي

العفو ..
سنتقدم جميعا إذا علمنا ماذا نحتاج
أي: الأسئلة ستعرفنا أي الطريق نسلك
تحياتي Smile

STRELiTZIA كتب :عندي ملاحظة صغيرة لتسهيل قراءة الــ Components المستعملة في برنامجك و تخص تسمية
[/COLOR]

تحياتي

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

و أنا شخصيا أدعم رأيك لأنه إذا أراد أحدهم التقدم بخطوات ثابتة لا بد من التفكير كمبرمج أو مطور حسب العمل.
تحياتي Smile
جزاك الله خيرا على هذا الشرح
السلام عليكم . . .
اشكرك على الموضوع
لكن ماذا تقصد بــ " إلا إذا أردت استعمال بعض الإجراء الأساسية ذات المستوى السفلي" ؟
أين اجد مكون المستخدم ؟
بحثت في كل التبويبات ولم اجده وانا استعمل delphi 7 second edition
amine0209 كتب :أين اجد مكون المستخدم ؟
بحثت في كل التبويبات ولم اجده وانا استعمل delphi 7 second edition

يجب عليك ان تحمله وتتبته
في الدلفي 7 لا ياتي الاندي معه
السلام عليكم ورحمة الله
هاك بعض المشاكل في الكود
1- sender1 غير معرف
2- لا يوجد خاصية localname في server1
استعمل دلفي 7 نسخة الاندي 9
الصفحات : 1 2