VB .NET - Programação MultiThread Socket - Servidor


Este artigo é continuação de : VB .NET - Programação MultiThread Socket - Cliente

A Programação Socket multithread significa que um servidor multithread pode se comunicar com mais de um cliente ao mesmo tempo usando a comunicação via socket.

A idéia básica por trás da programação multithread com sockets é que sempre que servidor receber um pedido de ligação de cliente, o servidor criará uma Thread (independente) em separado para a solicitação de cada cliente.

Isso significa que para cada cliente, existe uma thread do cliente em separado. Assim, o cliente pode se comunicar de forma independente com sua própria Thread cliente no servidor.

Na primeira parte criamos um cliente socket multithread que uma thread através da qual podia se comunicar com o servidor.

O servidor por sua vez irá atender cada cliente na sua respectiva thread.

O nosso servidor será bem simples iremos criar uma aplicação do tipo Console usando o Visual Basic 2010 Express Edition.

Criando o Servidor Multithread

Abra o Visual Basic 2010 Express Edition e crie um novo projeto do tipo Console Application com o nome ServidorSocket;

No módulo do projeto vamos iniciar definindo os seguintes namespaces:

Imports System.Text
Imports System.Net.Sockets
Imports System.Net

A agora inclua em Main() o seguinte código:

 Sub Main()

        Dim serverSocket As New TcpListener(IPAddress.Parse("127.0.0.1"), 2502)
        Dim clientSocket As TcpClient = Nothing
        Dim contador As Integer

        serverSocket.Start()
        msg("Server Started")
        contador = 0

        While (True)
            contador += 1
            clientSocket = serverSocket.AcceptTcpClient()
            msg("Client No:" + Convert.ToString(contador) + " inciado!")
            Dim cliente As New handleClinet
            cliente.iniciaCliente(clientSocket, Convert.ToString(contador))
        End While

        clientSocket.Close()
        serverSocket.Stop()
        msg("saida")

        Console.ReadLine()
    End Sub

Vamos criar uma classe chamada TrataCliente que irá conter os seguintes métodos:

   Public Class TrataCliente
        Dim SocketCliente As TcpClient
        Dim clienteNo As String

        Public Sub iniciaCliente(ByVal inSocketCliente As TcpClient, ByVal clineNo As String)
            Me.SocketCliente = inSocketCliente
            Me.clienteNo = clineNo
            Dim ctThread As Threading.Thread = New Threading.Thread(AddressOf doChat)
            ctThread.Start()
        End Sub

        Private Sub doChat()
            Dim contadorRequisicao As Integer
            Dim bytesFrom(10024) As Byte
            Dim dadosDoCliente As String
            Dim enviaBytes As [Byte]()
            Dim respostaServidor As String
            Dim rContador As String
            contadorRequisicao = 0

            While (True)
                Try
                    contadorRequisicao = contadorRequisicao + 1
                    Dim networkStream As NetworkStream = SocketCliente.GetStream()
                    networkStream.Read(bytesFrom, 0, CInt(SocketCliente.ReceiveBufferSize))
                    dadosDoCliente = Encoding.ASCII.GetString(bytesFrom)
                    dadosDoCliente = dadosDoCliente.Substring(0, dadosDoCliente.IndexOf("$"))
                    msg("Do cliente-" + clienteNo + dadosDoCliente)
                    rContador = Convert.ToString(contadorRequisicao)
                    respostaServidor = "Servidor para o cliente(" + clienteNo + ") " + rContador
                    enviaBytes = Encoding.ASCII.GetBytes(respostaServidor)
                    networkStream.Write(enviaBytes, 0, enviaBytes.Length)
                    networkStream.Flush()
                    msg(respostaServidor)
                Catch ex As Exception
                    MsgBox(ex.ToString)
                End Try

            End While

        End Sub
    End Class

Vamos definir também a rotina msg que exibe mensagens no console:

 Sub msg(ByVal texto As String)
        texto.Trim()
        Console.WriteLine(" >> " + texto)
    End Sub

Agora já podemos testar a nossa aplicação.

Para começar vamos executar o projeto Servidor que irá abrir a janela console e ser iniciado estando pronto para receber e atender as requisições:

Em seguida abra o projeto Cliente e execute-o:

Neste momento podemos ver que o cliente é iniciado e abre uma nova thread com o servidor que esta pronto para atendê-lo;

Assim , o Programa Servidor e o cliente estão conectados. Se você quiser testar a comunicação, clique no botão - Conectar ao Sevidor - no formulário do cliente, então você pode ver as mudanças no servidor e mensagens na tela do cliente.

Se clicarmos no botão Conectar com o servidor o cliente enviará uma mensagem para o servidor e receberá uma resposta conforme mostra a figura a seguir:

Se abrirmos outro projeto Cliente e o executarmos teremos uma nova thread iniciada com o servidor conforme a figura abaixo:

E dessa forma , sem complicar muito, mostramos como realizar uma comunicação multithread usando sockets.

As nossas aplicações são um esboço do que seria um programa de chat. Para torná-lo um programa mais funcional basta ajustar o código e incluir algumas funcionalidades.

Aguarde que em breve mostrarei como criar um programa de chat completo e funcional.

Pegue projeto Servidor completo aqui: ServidorSocket.zip

"Passará o céu e a terra, mas as minhas palavras jamais passarão." (Mateus 24:35)

Referências:


José Carlos Macoratti