شرح لكيفية عمل برنامج شات بالفيجوال بيسك دوت نت
chat application with vb.net
متطلبات العمل على هذا المشروع يجب ان تكون ملم بالموضوعات التالية :...
تعدد المسارات فى الفيجوال بيسك دوت نت
شرح HashTable
كتاب احتراف برمجة الشبكات
فى البداية سنقوم بعمل البرنامج الخاص بالسيرفر والذى سيقوم بالتنصت على البورت 8888 ويتعامل مع طلبات clients فعندما يطلب احد الكلينتس الاتصال يقوم السيرفر بتسجيله فى clientsList والتى هى عبارة عن HashTable ثم نقوم بانشاء مسار thread جديد للتعامل مع طلبات Clients
وعندما ترد رساله للسيرفر من العميل يقوم السيرفر بتحديد العميل مرسل الرسالة من clientsList ويرسل الرسالة للعملاء كلهم والتى يمكن ان نطلق على هذه العملية BroadCast لذا كل عميل يستطيع رؤية الرسائل المرسلة من باقى العملاء ويستطيع ارسال الرسائل ايضا
clientsList التى سوف يتم عملها ستقوم بتخزين اسماء العملاء Clients
اولاً : - انشاء برنامج السيرفر
1- نقوم بعمل مشروع جديد من نوع Console Application
2- استدعاء فضاء الاسماء الاتية
Imports System.Net.SocketsImports System.Text
3- داخل الموديول الرئيسى نقوم بانشاء كلاس يتعامل مع طلبات العملاء
Public Class handleClinet
Dim clientSocket As TcpClient
Dim clNo As String
Dim clientsList As Hashtable
هذا الاجراء يقوم بانشاء مسار لكل عميل يقوم بالاتصال بالسيرفر واستخدام الاجراء doChat
Public Sub startClient(ByVal inClientSocket As TcpClient, _
ByVal clineNo As String, ByVal cList As Hashtable)
Me.clientSocket = inClientSocket
Me.clNo = clineNo
Me.clientsList = cList
Dim ctThread As Threading.Thread =
New Threading.Thread(AddressOf doChat)
ctThread.Start()
End Sub
الاجراء التالى المستخدم من قبل المسار السابق
يقوم بعملية ارسال الرساله لباقى العملاء عن طريق استدعاء الاجراء broadCast
والذى سنقوم بعمله لاحقاً
Private Sub doChat()
Dim requestCount As Integer
Dim bytesFrom(10024) As Byte
Dim dataFromClient As String
Dim sendBytes As [Byte]()
Dim serverResponse As String
Dim rCount As String
requestCount = 0
While (True)
Try
requestCount = requestCount + 1
Dim networkStream As NetworkStream = _
clientSocket.GetStream()
networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize))
dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom)
dataFromClient = _
dataFromClient.Substring(0, dataFromClient.IndexOf("$"))
msg("From client - " + clNo + " : " + dataFromClient)
rCount = Convert.ToString(requestCount)
broadcast(dataFromClient, clNo, True)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End While
End Sub
End Class
4- انشاء اجراء broadCast والمسئول عن ارسال الرسالة لكل العملاء المسجلين بالسيرفر
Private Sub broadcast(ByVal msg As String, _
ByVal uName As String, ByVal flag As Boolean)
هنا يقوم بالمرور على كل المسجلين بالسيرفر وارسال الرساله لكل منهم Dim Item As DictionaryEntry For Each Item In clientsList Dim broadcastSocket As TcpClient broadcastSocket = CType(Item.Value, TcpClient) Dim broadcastStream As NetworkStream = _ broadcastSocket.GetStream() Dim broadcastBytes As [Byte]() If flag = True Then broadcastBytes = Encoding.ASCII.GetBytes(uName + " says : " + msg) Else broadcastBytes = Encoding.ASCII.GetBytes(msg) End If broadcastStream.Write(broadcastBytes, 0, broadcastBytes.Length) broadcastStream.Flush() Next End Sub
5- داخل الاجراء الرئيسى sub main الاكواد المتحكمه فى السيرفر
دى طبعا الليسته اللى بيتسجل فيها اسماء العملاء
Dim clientsList As New Hashtable Sub Main()
دا بيتنصت على البورت 8888 Dim serverSocket As New TcpListener(8888) Dim clientSocket As TcpClient Dim counter As Integer بدأ عملية التنصت serverSocket.Start() msg("Chat Server Started ....") counter = 0 While (True) counter += 1 clientSocket = serverSocket.AcceptTcpClient() Dim bytesFrom(10024) As Byte Dim dataFromClient As String استقبال طلبات اتصال العملاء Dim networkStream As NetworkStream = _ clientSocket.GetStream() networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize)) dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom) dataFromClient = _ dataFromClient.Substring(0, dataFromClient.IndexOf("$")) تسجيل العملاء بالليسته clientsList(dataFromClient) = clientSocket ارسال رساله لكل العملاء broadcast(dataFromClient + " Joined ", dataFromClient, False) msg(dataFromClient + " Joined chat room ")
انشاء اوبجكت من الكلاس للتعامل مع العملاء والتعامل مع رسائلهم Dim client As New handleClinet client.startClient(clientSocket, dataFromClient, clientsList) End While clientSocket.Close() serverSocket.Stop() msg("exit") Console.ReadLine() End Sub6- طبعا مننساش الاجراء الخاص بالطباعة على الشاشة
sub msg(ByVal mesg As String) mesg.Trim() Console.WriteLine(" >> " + mesg) End Sub
اولاً : - انشاء برنامج الكلينتسنقوم بانشاء برنامج windows form وستكون مهمته الاساسية ارسال الرسائل للسيرفر1- استدعاء فضاء الاسماءImports System.Net.Sockets Imports System.Text2- تعريفات عامةDim clientSocket As New System.Net.Sockets.TcpClient()
Dim serverStream As NetworkStream
Dim readData As String
Dim infiniteCounter As Integer
3- فى حدث الضغط على زر الاتصال بالسيرفر
Try
دى بتحول اسم العميل الى بايت عشان نرسلها للسيرفر Dim outStream As Byte() = Encoding.ASCII.GetBytes(TextBox1.Text & "$") الاتصال بالسيرفر 127.0.0.1 ودا لما يكون السيرفر على نفس الجهاز والبورت 8888
clientSocket.Connect("127.0.0.1", 8888)
بعدين تجهيز الرسالة وارسالها serverStream = clientSocket.GetStream serverStream.Write(outStream, 0, outStream.Length) serverStream.Flush() Catch ex As Exception MsgBox(ex.Message) End Try
4- زر ارسال الرسالة
readData = "Conected to Chat Server ..." msg()
نفس اللى عملناه فى السابق بس دى مع الرسالة serverStream = clientSocket.GetStream Dim outstream As Byte() = System.Text.Encoding.ASCII.GetBytes(TextBox3.Text & "$") serverStream.Write(outstream, 0, outstream.Length) serverStream.Flush()
عمل مسار عشان يتنصت على البورت ويتلقى الرسائل من السيرفر Dim ctThread As Threading.Thread = New Threading.Thread(AddressOf getMessage) ctThread.Start()
5- اجراء التنصت واستقبال الرسائل
Private Sub getMessage() For infinteCounter = 1 To 2 infinteCounter = 1 serverStream = clientSocket.GetStream Dim buffSize As Integer Dim inStream(10024) As Byte buffSize = clientSocket.ReceiveBufferSize serverStream.Read(inStream, 0, buffSize) Dim returnData As String = System.Text.Encoding.ASCII.GetString(inStream) returnData = "" + returnData msg() Next End Sub
والان تم الانتهاء من البرنامجين
تحميل الاكواد الخاصة بالبرنامجين السابقين : -
برنامج server
برنامج Client
ليست هناك تعليقات:
اضافة تعليق