Este artigo é continuação de VB .NET – Programação
MultiThread Socket – Cliente
Já sabemos que 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 ideia básica por trás da
programação multithread com sockets é que sempre que o 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.
No artigo anterior, 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:
- iniciaCliente –
- doChat –
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 está 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 o projeto Servidor
completo aqui: ServidorSocket.zip