تطبيق :
لا يستطيع اي شخص معرفة عناوين بقية الاشخاص الذين يملكون برنامج المحادثة ليتحادث مع من يحب بطريقة اعتيادية لذالك. لكي يتمكن الشخص ان يتحدث مع من يحب داخل الشبكة نكون server index كل شخص يشغل برنامج المحادثة يسجل اسمه وعنوان عند server index ويعطيه اسماء وعنوانين بقية الاشخاص ضمن الشبكة حتى يستطيع محادثتهم محادثة شخصية عبر عناوينهم..ففي بدية الامر يرسل كل شخص يدخل الشبكة رسالة Broadcast الى الجميع يسئل عن الخادم فيستلم الجميع الرسالة فقط الخادم يجاوب على الرسالة ويعطيه ويعطيه اسماء وعنوانين بقية الاشخاص ضمن الشبكة....................
وهناك طريقة اخرى بدون server index يرسل الشخص رسالة Broadcast يستلمها كل المتواجدين على الشبكة واي شخص يستلم الرسالة يستطيع الاجابة عليها او هملها اذا اجاب عليها يرسل اسمه وعنوانه الى الشخص الذي عمل Broadcast وبذالك يكول لديه سجل باسماء وعناوين لكل المتواجدين داخل الشبكة
طريقة server index اقل حمل على الشبكة من هذه الطريقة لان server index وحده يجيب على الرسالة اما الطريقة الثانية جميع المتواجدين يجيبون على الرسالة مما يؤدي الى حمل على الشبكة وسنقوم ببرمجة الطريقتين
لنبدء بطريقة الثانية بدون server index هنا كل شخص هوا خادم وعميل يرسل ويستقبل الرسائل بداية نكون فورم بشكل التالي
نص اسم الشخص اسمه myname ونص الرسالة المرسلة اسمه send_m ونص الرسائل المستلمه اسمه recived_m وزر البحث اسمه search_Button1 وزر الراسل اسمه send_button
ثم نكون دالة لارسال رسالة الى كل المتواجدين داخل الشبكة تحوي اسم الشخص وعنوانه ورمز يدل على انها عملية طلب تعريف او طلب صداقة وهنا نستخدم الرمز $ ونحن مخيرين برموز. حتى المستلم يعرف ما نوع الرسالة هل هي طلب تعريف او تاكيد او بيانات اعتيادية استخدمنا هذا الرمز
وهذه دالة ارسال هذه الرسالة للجميع
Sub send_Data_Broadcast(ByVal inf_nameANDip As String) Try Dim ip_address As String = IPAddress.Broadcast.ToString Dim udpClientBroadcast As New UdpClient(ip_address, 9001) Dim sendBytes As Byte() sendBytes = Encoding.ASCII.GetBytes(inf_nameANDip) udpClientBroadcast.Send(sendBytes, sendBytes.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
كود البرنامج كامل
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.IO
Imports System.Threading
Public Class send_message
Dim myth As Thread
Dim udpClient As New UdpClient(9001)
Public Function GetIPAddress() As String
Dim oAddr As System.Net.IPAddress
Dim sAddr As String
With System.Net.Dns.GetHostByName(System.Net.Dns.GetHostName())
oAddr = New System.Net.IPAddress(.AddressList(0).Address)
sAddr = oAddr.ToString
End With
GetIPAddress = sAddr
End Function
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
Sub send_Data_Broadcast(ByVal inf_nameANDip As String)
Try
Dim ip_address As String = IPAddress.Broadcast.ToString
Dim udpClientBroadcast As New UdpClient(ip_address, 9001)
Dim sendBytes As Byte()
sendBytes = Encoding.ASCII.GetBytes(inf_nameANDip)
udpClientBroadcast.Send(sendBytes, sendBytes.Length)
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Private Sub send_button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles send_button.Click
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
End SubSub 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
Private Sub send_message_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
Try
udpClient.Close()
myth.Abort()
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Private Sub send_message_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
myth = New Thread(New System.Threading.ThreadStart(AddressOf REcivedData))
myth.Start()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles search_Button1.Click
send_Data_Broadcast("$" & myname.Text & "=&&=" & GetIPAddress())
End Sub
Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
Try
Dim splitip_name() As String = Split(ListBox1.SelectedItem, "=&&=")
Dim splitip_name1() As String = Split(splitip_name(0), "=")
GroupBox2.Text = "typing message sent to(" & splitip_name1(1) & ")"
Catch ex As Exception
End Try
End Sub
Private Sub recived_m_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles recived_m.TextChanged
' fro put Focus on last coloumns in arrive text
Try
recived_m.Focus()
recived_m.Select(Len(recived_m.Text) - 1, 0)
recived_m.Focus()
Catch ex As Exception
End Try
End Sub
End Classعند تنفيذ البرنامج وقدوم طلبات شاهد نافذة البرنامج
حمل المثال من المرفقات
مدونتي


