VB 2005 - Criando um Chat com Winsock


O caminho natural e aconselhável para trabalhar com comunicação em rede é usar os namespaces System.Net ou System.Net.Sockets. Estes namespaces oferecem recursos para realizarmos diversas tarefas envolvendo comunicação em rede.

Veja os meus artigos tratando de alguns destes recursos nos links abaixo:

Mas você pode também usar o velho e bom controle OCX Winsock para realizar comunicação remota e é isto que eu mostro neste artigo. Vamos ver uma pequena aplicação que embora simples funciona perfeitamente para comunicação cliente/servidor em um chat.

Abra o Visual Basic 2005 Express e crie um novo projeto do tipo Windows Application com o nome Sockets_Winsock.

Inclua três formulários no projeto cada um com leiaute conforme exibido nas  figura a seguir. (O código de cada formulário esta exibido ao lado)

Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click
     MsgBox(
"www.macoratti.net" & vbNewLine & "Use e abuse deste programa de char")
End Sub

Private Sub Label2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label2.Click
     MsgBox(
"www.macoratti.net onde você encontra quase tudo sobre Visual Basic e ASP.")
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

Static i As Integer

Dim frmClient As New frmClient()

If Me.Opacity < 100 Then

Me.Opacity = Me.Opacity + 0.05

Me.Refresh()

End If

If Me.Opacity = 1.0 Then

i = i + 1

If i = 50 Then

Timer1.Enabled = False

frmClient.Show()

End If

End If

End Sub

 

 
Form3.vb - O formulário de apresentação ou tela de splash screen. Código do formulário form3.vb

Private Sub frmClient_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

     My.Forms.frmServer.Show()

End Sub
 

Private Sub txtSend_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtEnvia.KeyPress


If
Asc(e.KeyChar) = 13
Then

Sock.SendData(Now & ">" & txtEnvia.Text)

TxtMsgConector.Text = String.Concat(TxtMsgConector.Text, vbNewLine & txtEnvia.Text)

txtEnvia.Text = ""

End If

End Sub


Private
Sub Sock_DataArrival(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) Handles
Sock.DataArrival


Dim
A As Object =
Nothing

Dim NewString As String = ""

Dim Character As Byte

Sock.GetData(A)


'ESTA VERSÃO DO WINSOCK É DIFERENTE DA VERSÃO DO VB6

'Somente Bytes podem ser enviados com o winsock, logo teremos que receber muitos bytes e

'devemos converter para Char

For Each Character In A

     NewString = String.Concat(NewString, Chr(Character))

Next
 

'Após isso concatene para um textBox

TxtMsgConector.Text = String.Concat(TxtMsgConector.Text, vbNewLine, NewString)

End Sub
 

Private Sub BtnConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnConnect.Click


BtnConnect.Enabled =
False

Sock.RemotePort = 2909

Sock.RemoteHost = Sock.LocalIP ' Ou localhost


'Se você estiver conectado a um LAN terá que por o seu endereço IP

Sock.Connect()

End Sub

 

Form1.vb - O formulário da aplicação Cliente que se conecta com o servidor para enviar mensagens. Código do formulário form1.vb

Private Sub frmServer_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
 

Sock.LocalPort = 2909

Sock.Listen()

lstAcoesServidor.Items.Add("Servidor esta escutando...")

End Sub


Private
Sub Sock_ConnectionRequest(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_ConnectionRequestEvent) Handles
Sock.ConnectionRequest


Sock.Close()

lstAcoesServidor.Items.Add("Tentando obter conexão...")

Sock.Accept(e.requestID)

lstAcoesServidor.Items.Add("Conectado!!!...")

Sock.SendData("BenVindo ao Servidor!!!, Agora, pode usar o CHAT!")


End
Sub

 

Private Sub txtSend_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtEnvia.KeyPress


If
Asc(e.KeyChar) = 13
Then

     Sock.SendData(Now & ">" & txtEnvia.Text)

     TxtMsgServidor.Text = String.Concat(TxtMsgServidor.Text, vbNewLine & txtEnvia.Text)

     txtEnvia.Text = ""

     lstAcoesServidor.Items.Add("Msg enviada >")

End If

End Sub
 

Private Sub Sock_DataArrival(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) Handles Sock.DataArrival


Dim
A As Object =
Nothing

Dim NewString As String = ""

Dim Character As Byte

lstAcoesServidor.Items.Add("Msg recebida <")

Sock.GetData(A)


'ESTA VERSÃO DO WINSOCK É DIFERENTE DA VERSÃO DO VB6

'Somente Bytes podem ser enviados com o winsock, logo teremos que receber muitos bytes e

'devemos converter para Char

For Each Character In A

   NewString = String.Concat(NewString, Chr(Character))

Next
 

'Depois de concatenar mostra no textbox

TxtMsgServidor.Text = String.Concat(TxtMsgServidor.Text, vbNewLine, NewString)

End Sub

 

Form2.vb - O formulário do servidor que fica escutando em uma porta e recebe e envia mensagens. Código do formulário form2.vb

No exemplo o servidor e o cliente estão no mesmo projeto para simplificar pois estamos testando na máquina local.

Após rodar o projeto basta , a partir do formulário Cliente, se conectar com o servidor e iniciar o chat...

Como eu já tratei dos métodos do Winsock não vou repetir o que já disse. Você pode ler as referências para tirar dúvidas sobre os métodos usados no projeto.

Simples, direto e objetivo: VB 2005.

Pegue o projeto aqui: CHAT_Net.zip (contendo AxInterop.MSWinsockLib.dll e Interop.MSWinsockLib.dll)

Até o próximo artigo...

referências:


José Carlos Macoratti