الأربعاء، 14 مارس 2012

مجموعة حاسبات موزعة على شبكة كيف نكون برنامج محادثة خاصة بين الاعضاء وعمل بيئة تفاعلية

تطبيق :هذا التطبيق تم بنائه ببروتوكول UDP نضرا لقابلية هذا البروتوكول على البث الجماعي
لا يستطيع اي شخص معرفة عناوين بقية الاشخاص الذين يملكون برنامج المحادثة ليتحادث مع من يحب بطريقة اعتيادية لذالك. لكي يتمكن الشخص ان يتحدث مع من يحب داخل الشبكة نكون server index كل شخص يشغل برنامج المحادثة يسجل اسمه وعنوان عند server index  ويعطيه اسماء وعنوانين بقية الاشخاص ضمن الشبكة حتى يستطيع محادثتهم  محادثة شخصية عبر عناوينهم..ففي بدية الامر يرسل كل شخص يدخل الشبكة رسالة Broadcast الى الجميع يسئل عن  الخادم فيستلم الجميع الرسالة فقط الخادم يجاوب على الرسالة ويعطيه ويعطيه اسماء وعنوانين بقية الاشخاص ضمن الشبكة....................
وهناك طريقة اخرى بدون server index يرسل الشخص  رسالة Broadcast يستلمها كل المتواجدين على الشبكة واي شخص يستلم الرسالة يستطيع الاجابة عليها او هملها اذا اجاب عليها يرسل اسمه وعنوانه الى الشخص الذي عمل Broadcast وبذالك يكول لديه سجل باسماء وعناوين  لكل المتواجدين  داخل الشبكة 

طريقة server index اقل حمل على الشبكة من هذه الطريقة  لان server index وحده يجيب على الرسالة اما الطريقة الثانية جميع المتواجدين يجيبون على الرسالة مما يؤدي الى حمل على الشبكة وسنقوم ببرمجة  الطريقتين
لنبدء بطريقة الثانية بدون server index هنا كل شخص هوا خادم وعميل يرسل ويستقبل الرسائل بداية نكون فورم بشكل التالي
نص اسم الشخص اسمه myname ونص الرسالة المرسلة اسمه   send_m ونص الرسائل المستلمه اسمه recived_m وزر البحث اسمه search_Button1 وزر الراسل اسمه send_button
ثم نكون دالة لارسال  رسالة الى كل المتواجدين داخل الشبكة تحوي اسم الشخص وعنوانه ورمز يدل على انها عملية طلب تعريف او طلب صداقة  وهنا نستخدم الرمز $  ونحن مخيرين برموز. حتى المستلم يعرف ما نوع  الرسالة هل هي طلب تعريف او تاكيد او بيانات اعتيادية استخدمنا هذا الرمز






 وهذه دالة ارسال هذه الرسالة للجميع
VB.net Code
Sub send_Data_Broadcast(ByVal the_message As String)
Try
Dim udpClient As New UdpClient(IPAddress.Broadcast.ToString,9001)
udpClient.Send(the_message, the_message.Length)
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub


الرسالة سنرسلها بشكل التالي(عنوانه  =&&=  اسم الشخص$) واستخدمنا =&&=   حتى المستلم عندما يقرء بداية الرسالة ويعرف انها تبدء ب$ يعرف انها طلب من شخص ما لأضافته داخل قائمة الاصدقاء يستطيع ان يعرف اسم الشخص وعنوانه من خلال فصل الرسالة بدالة  التالية
 split(message,” =&&=”) 
نستدعي الدالة لكي نرسل رسالة للجميع بشكل التالي


كود
 send_Data_Broadcast("$" & myname.Text & "=&&=" & GetIPAddress())


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



كود التنصت لكل شخص
 Dim udpClient As New UdpClient(9001)
Sub REcivedData()
While True
Dim RemoteIpEndPoint As New IPEndPoint(IPAddress.Any, 0)
Dim receiveBytes As Byte()
receiveBytes = udpClient.Receive(RemoteIpEndPoint)
Dim returnData As String = Encoding.ASCII.GetString(receiveBytes, 0, receiveBytes.Length)
' recived asked to add in his list chat from some one
If returnData(0) = "$" Then
returnData = Mid(returnData, 2, Len(returnData) - 1)
Dim splitip_name() As String = Split(returnData, "=&&=")
If MsgBox(splitip_name(0) & vbNewLine & "--> is ask to add you in his list chat to chating with you ", MsgBoxStyle.Information + MsgBoxStyle.OkCancel, "offer chat") = MsgBoxResult.Ok Then
' if you accept his ask send message to him contain your name and ip
send_Data_to_one(splitip_name(1), "%" & myname.Text & "=&&=" & GetIPAddress())
ListBox1.Items.Add(" you accept Asked=" & returnData)
End If
'some one accept my visit
ElseIf returnData(0) = "%" Then
returnData = Mid(returnData, 2, Len(returnData) - 1)
ListBox1.Items.Add("visit accept=" & returnData)
' other recived data place in input data chat it certain come from identiy user
Else
recived_m.Text = recived_m.Text & vbNewLine & returnData
End If
End While
End Sub


نلاحظ انه  اذا قبلو الصداقة يضاف اسم الشخص السائل وعنوانه الى قائمة الاصدقاء ويرسل له رسالة تحوي اسم الشخص الحالي وعنوانه مسبوق بعلامة % بشكل التالي (عنوانه  =&&=  اسم الشخص%)  دال  على انها رسالة تاكيد صداقة فعندما يستلم الشخص الذي ارسل طلب الصداقة هذه الرسالة يضيف كل شخص قبل الصداقة في قائمة الاصدقاء وتكون له قائمة بالاشخاص الذين طلبو صداقته وطلب صداقتهم ويستطيع الضغط على اي شخص موجود ضمن Listbox1 منهم وارسال رساله اليه بشكل التالي
 Try
Dim splitip_name() As String = Split(ListBox1.SelectedItem, "=&&=")
send_Data_to_one(splitip_name(1), myname.Text & " : " & send_m.Text)
Catch ex As Exception
End Try
 send_Data_to_one هي دالة لارسال رسالة الى شخص محدد لارسال بيانات له وحده 
Sub send_Data_to_one(ByVal ip_adderss As String, ByVal the_message As String)
 Try
Dim udpClientto_one As New UdpClient(ip_adderss, 9001)
Dim sendBytes As Byte()
sendBytes = Encoding.ASCII.GetBytes(the_message)
udpClientto_one.Send(sendBytes, sendBytes.Length)
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub








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


هذا البرنامج  نستطيع تطبيقه على Windows Mobile حيث نكون شبكة من مجموعة موبايلات مرتبطة براوتر مكونة شبكة وأي فأيWiFi    و  كل شخص يدخل الشبكة يرسل رسالة للجميع يسأل عن المتواجدين وكل شخص موجود يجاوبه ويضيفه في قائمته. ويستطيعون محادثة بعضهم وتبادل المعلومات بدون انترنت أو خسارة في الرصيد.أي لتنفيذ هذا البرنامج في ارض الواقع نشتري راوتر ونشغله ونجعل الأجهزة المحمولة تتصل به.




نفتح مشروع SmartDevice    جديد ونكون فورم كما في الشكل للمستخدمين






حمل المثال من هنا
إرسال تعليق