• 0
DreamNet

درس في انشاء برنامج خادم /عميل بالديركت بلاي 8

سؤال

بسم الله الرحمن الرحيم

درس في انشاء برنامج خادم /عميل بالديركت بلاي 8

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

قبل التطرق الى الدرس فقط يجب علينا ان نعرف شئ أساسي وهو أننا سنستعمل كائن من كائنات الديركت اكس ومن ثم فالأمثلة التي سنتطرق اليها يجب أن يضاف لها المرجع الخاص بالديركت اكس

1-إنشاء برنامج الخادم :

بعد اضافة المرجع الخاص بالديركت اكس كما سبق وان ذكرنا نبدا الآن بالتعريف بالمتغيرات التي سنستعملها في برنامجنا

نحتاج لانجاز برنامجنا 3 متغيرات أساسية هي

1- متغير أساسي وهو نسخة من الكائن ديركت اكس وليكن dx الذي سيكون له الدور الأساسي في انشاء بقية المتغيرات

2- متغير يقوم بعمل الخادم من النوع ديركت بلاي سرفر

3- متغير يقوم بانشاء عناوين الip ونوع البروتوكولات

Private dx As New DirectX8
Private dps As DirectPlay8Server
Private dpa As DirectPlay8Address

وللاستفادة من الاحداث الخاصة بالديركت بلاي يجب اضافة السطر

Implements DirectPlay8Event

بعد اضافة السطر الأخير سنرى أن جميع الأحداث(17) الخاصة بالكائن DirectPlay8Event أصبحت متوفرة سنتطرق بالتدريج لكل حدث حين الحاجة لذكره المهم الآن يجب علينا ان تكون كل الأحداث مكتوبة الآن أي ال17 حدث موجودة في الكود بدون كتابة أي اجراء حتى لا يحصل خطا في تنفيذ البرنامج

بماننا استدعينا أحداث الكائن فيجب أن تتواجد كل هذه الاحداث المهم الطريقة بسيطة

فقط علينا الذهاب في صفحة الكود واختيار DirectPlay8Event فنجد جميع الأحداث الخاصة به ومن ثم نختار الواحد تلو الآخر حتى يصبح لدينا مايلي:

Private Sub DirectPlay8Event_AddRemovePlayerGroup(ByVal lMsgID As Long, ByVal lPlayerID As Long, ByVal lGroupID As Long, fRejectMsg As Boolean)
End Sub
Private Sub DirectPlay8Event_AppDesc(fRejectMsg As Boolean)
End Sub
Private Sub DirectPlay8Event_AsyncOpComplete(dpnotify As DxVBLibA.DPNMSG_ASYNC_OP_COMPLETE, fRejectMsg As Boolean)
End Sub
Private Sub DirectPlay8Event_ConnectComplete(dpnotify As DxVBLibA.DPNMSG_CONNECT_COMPLETE, fRejectMsg As Boolean)
End Sub
Private Sub DirectPlay8Event_CreateGroup(ByVal lGroupID As Long, ByVal lOwnerID As Long, fRejectMsg As Boolean)
End Sub
Private Sub DirectPlay8Event_CreatePlayer(ByVal lPlayerID As Long, fRejectMsg As Boolean)
End Sub
Private Sub DirectPlay8Event_DestroyGroup(ByVal lGroupID As Long, ByVal lReason As Long, fRejectMsg As Boolean)
End Sub
Private Sub DirectPlay8Event_DestroyPlayer(ByVal lPlayerID As Long, ByVal lReason As Long, fRejectMsg As Boolean)
End Sub
Private Sub DirectPlay8Event_EnumHostsQuery(dpnotify As DxVBLibA.DPNMSG_ENUM_HOSTS_QUERY, fRejectMsg As Boolean)
End Sub
Private Sub DirectPlay8Event_EnumHostsResponse(dpnotify As DxVBLibA.DPNMSG_ENUM_HOSTS_RESPONSE, fRejectMsg As Boolean)
End Sub
Private Sub DirectPlay8Event_HostMigrate(ByVal lNewHostID As Long, fRejectMsg As Boolean)
End Sub
Private Sub DirectPlay8Event_IndicateConnect(dpnotify As DxVBLibA.DPNMSG_INDICATE_CONNECT, fRejectMsg As Boolean)
End Sub
Private Sub DirectPlay8Event_IndicatedConnectAborted(fRejectMsg As Boolean)
End Sub
Private Sub DirectPlay8Event_InfoNotify(ByVal lMsgID As Long, ByVal lNotifyID As Long, fRejectMsg As Boolean)
End Sub
Private Sub DirectPlay8Event_Receive(dpnotify As DxVBLibA.DPNMSG_RECEIVE, fRejectMsg As Boolean)
End Sub
Private Sub DirectPlay8Event_SendComplete(dpnotify As DxVBLibA.DPNMSG_SEND_COMPLETE, fRejectMsg As Boolean)
End Sub
Private Sub DirectPlay8Event_TerminateSession(dpnotify As DxVBLibA.DPNMSG_TERMINATE_SESSION, fRejectMsg As Boolean)
End Sub

الآن نذهب الى تهيئة الخادم :

في البداية يجب علينا تهيئة الكائنين dps و dpa بكتابة السطرين :

    Set dps = dx.DirectPlayServerCreate
   Set dpa = dx.DirectPlayAddressCreate

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

وهذه المعلومات تدرج في متغير من النوع DPN_APPLICATION_DESC

    Dim appdesc As DPN_APPLICATION_DESC
 With appdesc
.guidApplication = "{0AC3AAC4-5470-4cc0-ABBE-6EF0B614E52A}"
.lMaxPlayers = 1000
.SessionName = "Server"
.lFlags = DPNSESSION_CLIENT_SERVER
 End With

القيمة الأولى تحدد قيمة ال GUID globally unique identifier المستعمل في الريجيستري للتطبيق

الثانية طبعا الحدى الأقصى للمتصلين

الثالثة اسم الجلسة

نوع التطبيق أو الجلسة المنشئة

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

dps.RegisterMessageHandler Me

الآن نقوم بتحديد نوع البروتوكول والمنفذ الذي سيتم الاستماع منه لانتظار الاتصال طبعا باستعمال dpa

    dpa.SetSP DP8SP_TCPIP
   dpa.AddComponentLong DPN_KEY_PORT, 1090

الثابت DP8SP_TCPIP يرمز الى نوع البروتوكول الذي هو TCP/IP الذي سنستعمله

ثم نضيف قيمة البور تحت اسم DPN_KEY_PORT الذي هو في الحقيقة ="port"

الآن يمكن تشغيل الخادم :

dps.Host appdesc, dpa

لا تنسوا ايقاف عمل الخادم قبل انهاء البرنامج

   If Not dps Is Nothing Then dps.UnRegisterMessageHandler
   If Not dps Is Nothing Then dps.Close
   Set dps = Nothing
   Set dpa = Nothing
   Set dx = Nothing

في الدرس القادم سنرى كيف ننشئ برنامج العميل ثم نعود لبرنامج الخادم لنرى كيف نستعمل أحداث الديركت بلاي

بالتوفيق للجميع

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

11 إجابة على هذا السؤال .

  • 0

جزاك الله عنا خيرا يا أخي اللهم إفتح عليه من أنوار علمك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

إنشاء برنامج العميل

بنفس الخطوات نقوم بانشاء برنامج العميل فقط التسميات هنا ستختلف بعض الشئ

الآن للاتصال علينا أولا أن نعين البروتوكول المستعمل للاتصال وتحديد عنوان و منفذ الخادم في هذه الحالة نستعمل متغيرين من النوع DirectPlay8Address فنبدأ بالتعريفات طبعا في قسم التصريحات العامة وبعد اضافة المرجع الخاص بالديركت اكس 8

Private dx As New DirectX8
Private dpc As DirectPlay8Client
Private dpa As DirectPlay8Address
Private dpas As DirectPlay8Address
Implements DirectPlay8Event

كما في برنامج الخادم نقوم بتهيئة الكائنات المستعملة dpc dpas و dpa بكتابة السطرين :

    Set dpc = dx. DirectPlayClientCreate
   dpc.RegisterMessageHandler Me
   Set dpa = dx.DirectPlayAddressCreate
   Set dpas = dx.DirectPlayAddressCreate

Dpa خاص بالعنوان المحلي فقط علينا تحديد نوع البروتوكول هنا

Dpas خاص بالخادم وهنا نحدد العنوان والمنفذ ونوع البروتوكول ايضا

    dpa.SetSP DP8SP_TCPIP
   dpas.SetSP DP8SP_TCPIP
   dpas.AddComponentString DPN_KEY_HOSTNAME, "127.0.0.1"
   dpas.AddComponentLong DPN_KEY_PORT, 1090

هنا حددنا بروتوكول ال TCPIP لنتصل بالعنوان 127.0.0.1 على المنفذ 1090

لكي يتم الاتصال يجب أن يكون للتطبيقين نفس GUID يعني المستعمل في برنامج الخادم

    Dim appdesc As DPN_APPLICATION_DESC
   With appdesc
       .guidApplication = "{0AC3AAC4-5470-4cc0-ABBE-6EF0B614E52A}"
   End With

حتى يتعرف الخادم على العميل المتصل يعني اسمه ندرج هذه المعلومات في كائن من النوع

DPN_PLAYER_INFO

    Dim ClientInfo As DPN_PLAYER_INFO
   ClientInfo.lInfoFlags = DPNINFO_NAME
   ClientInfo.Name = "DreamNet"
   dpc.SetClientInfo ClientInfo

الآن نستطيع الاتصال بالخادم بكتاية

dpc.Connect appdesc, dpas, dpa, 0, ByVal 0&, 0

نفس الشئ بالنسبة للخادم يجب تحرير الذاكرة من الكائنات المستعملة عند انهاء البرنامج

    If Not dpc Is Nothing Then dpc.UnRegisterMessageHandler
   If Not dpc Is Nothing Then dpc.Close
   Set dpc = Nothing
   Set dpa = Nothing
   Set dpas = Nothing
   Set dx = Nothing

الآن يمكن التطرق الى أحداث الديركت بلاي

أولا متى نعرف أن العميل اتصل بالخادم فقط عندما يتم الحدث DirectPlay8Event_ConnectComplete

ثانيا معرفة أن الخادم اغلق عندما يتم الحدث DirectPlay8Event_TerminateSession

نعود نذكر ببرنامج الخادم

يمكننا عند اتصال العميل استخلاص اسم العميل المتصل في الحدث DirectPlay8Event_CreatePlayer

فقط علينا اضافة الكود التالي في الحدث المذكور

    On Error Resume Next
   Dim dpPeer As DPN_PLAYER_INFO
   dpPeer = dps.GetClientInfo(lPlayerID)
   MsgBox dpPeer.Name & " Connected"

في المرة القادمة نتطرق الى ارسال الرسائل بين الخادم والعميل

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شرح رائع , متميز دائماً اخى DreamNet :rolleyes:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

التخاطب بين العميل والخادم

بالنسبة لارسال الرسائل بين الخادم والعميل فهناك بعض الاختلاف البسيط فنحن نستعمل كائنين الاول من النوع

DirectPlay8Server لبرنامج الخادم و DirectPlay8Client لبرنامج العميل

فالمتغير dps يحوي دالة تقوم بارسال البيانات هي SendTo تحوي 4 عناصر

 dps.SendTo (idSend, BufferData, TimeOut, CONST_DPNSENDFLAGS)

idSend يمثل متغير خاص بالعميل المتصل حاليا المرسل اليه

BufferData يمثل البيانات من النوع Byte التي سيتم ارسالها

TimeOut عدد يمثل أجزاء من الألف من الثانية للوقت الذي يتم فيه الانتظار لارسال الرسالة

CONST_DPNSENDFLAGS متغير من هذا النوع يحدد طريقة ارسال البيانات

أما بالنسبة للمتغير من النوع DirectPlay8Client فالدالة هي Send تحوي على نفس العناصر المذكورة سابقا فقط بدون تحديد idSend يعني تكتب

dpc.Send ( BufferData, TimeOut, CONST_DPNSENDFLAGS)

استقبال البيانات المرسلة :

عند ارسال البيانات بالطريقة التي رايناها يتم استدعاء الحدث DirectPlay8Event_Receive في الجهة المستقبلة الحدث يحوي عنصر يقوم بتخزين البيانات المستقبلة وهو dpnotify من النوع DxVBLibA.DPNMSG_RECEIVE فقط هنا يجب أن نذكر أن البيانات المرسلة تكون عبارة عن bytes يعني لقرائتها علينا تحويلها اذا كنا نريد الى تكست مثلا

نستعمل الدالة GetStringFromBuffer

Text =GetStringFromBuffer(dpnotify.ReceivedData, 0)

نرجع قليلا الى الوراء لكي نأكد على أن ارسال البيانات هنا ليس ارسال متغيرات string لذا علينا أن تحويل الكلمات الى جدول بايت ومن ثم ارساله

ولهذا الغرض نستعمل الدالة AddStringToBuffer

Dim Buf() As Byte
AddStringToBuffer Buf, Text1.Text, 0
dpc.Send Buf, 0, DPNSEND_NOLOOPBACK

هذه فقط بعض الجوانب البسيطة لتطبيق برنامج عميل/خادم باستعمال الديركت بلاي

بالتوفيق للجميع

الملف مرفق لتطبيق الدرس

test.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

درس رائع

جزاك الله عنا كل خير

منذ مدة لم نرى دروس في مثل هذا المستوى

نرجو من المشرفين تثبيت الموضوع للأهمية

متميز دائما (h)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لا أرى تفاعل من اهل الخبرة وينكم شباب

وين المشرفين الا يستحق الدرس التثبيت ولو في قسم الدروس (h)

ننتظر منك عزيزي دروس في الشات الصوتي بالديركت بلاي ومشكور مرة تاني

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لا أظن أن مثل هذه الدروس يكون لها تفاعل كبير اخي

شكرا لتحمسك دائما

بالتوفيق للجميع

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مشكور ألف يا DreamNet

من فتره وأنا ابحث عن مثل هذا الدرس (h)

مشكور

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مشكووور اخي العزيز على هذا الدرس الرائع

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا علي السرح الررراااااااااااااااااااائع

جزاك الله كل خير

موضوع متميز فعلا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .