الجمعة، 14 يوليو 2017

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

شرح لكيفية عمل برنامج شات بالفيجوال بيسك دوت نت
 chat application with vb.net



متطلبات العمل على هذا المشروع يجب ان تكون ملم بالموضوعات التالية :...
تعدد المسارات فى الفيجوال بيسك دوت نت
شرح HashTable
كتاب احتراف برمجة الشبكات

فى البداية سنقوم بعمل البرنامج الخاص بالسيرفر والذى سيقوم بالتنصت على البورت 8888 ويتعامل مع طلبات clients فعندما يطلب احد الكلينتس الاتصال يقوم السيرفر بتسجيله فى clientsList والتى هى عبارة عن HashTable ثم نقوم بانشاء مسار thread جديد للتعامل مع طلبات Clients 
وعندما ترد رساله للسيرفر من العميل يقوم السيرفر بتحديد العميل مرسل الرسالة من clientsList ويرسل الرسالة للعملاء كلهم والتى يمكن ان نطلق على هذه العملية BroadCast لذا كل عميل يستطيع رؤية الرسائل المرسلة من باقى العملاء ويستطيع ارسال الرسائل ايضا 
clientsList التى سوف يتم عملها ستقوم بتخزين اسماء العملاء Clients 

اولاً : - انشاء برنامج السيرفر 

1- نقوم بعمل مشروع جديد من نوع Console Application 
2- استدعاء فضاء الاسماء الاتية 
Imports System.Net.Sockets
Imports 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 Sub
6- طبعا مننساش الاجراء الخاص بالطباعة على الشاشة 
sub msg(ByVal mesg As String)
        mesg.Trim()
        Console.WriteLine(" >> " + mesg)
End Sub

اولاً : - انشاء برنامج الكلينت
سنقوم بانشاء برنامج windows form وستكون مهمته الاساسية ارسال الرسائل للسيرفر 
1- استدعاء فضاء الاسماء 
Imports System.Net.Sockets
Imports System.Text
2- تعريفات عامة 
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

ليست هناك تعليقات:

اضافة تعليق

جميع الحقوق محفوظة © 2019 الحقيبة البرمجية لمبرمجى VB.NET