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