 VB 2005 -
Criando um 
Chat com Winsock
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 + 1If 
        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
 
        FalseBtnConnect.Enabled =
 
        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 | 
  
    |  | 
      
        | 
        PrivateSub 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)
CHAT_Net.zip (contendo 
AxInterop.MSWinsockLib.dll e Interop.MSWinsockLib.dll)
Até o próximo artigo... 
referências:
José Carlos
Macoratti