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: