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: