Primeiramente, gostaria de agradecer ao Coord. De Conteúdo Eigenlieb, isto me anima a escrever tutos e ajudar a comunidade, e também ao Nostradamus, que adotou a ideia do manager que eu iniciei o projeto, e também se mostrou bastante interessado.
Vlw Mesmo!
Vamos Começar.
Primeiro precisamos entender o conceito de client-server que na verdade é bem simples, vamos tomar um exemplo prático, VOCÊ!
Digamos que VOCÊ (Client) chega para seu Pai (PS: com 17 Anos de Idade) e pergunta:
- Pai, deixa eu dirigir o carro?
O Pai (Server), responde,
- Nãooo!
Com este exemplo ficou bem facil entender como funciona, o client pergunta e o servidor responde a solicitação (pergunta) do Client.
Agora vem , Pow! Sprit não parece ser taum simples fazer um programa que responda as solicitações de outro programa. Pois é porém as solicitações são pré definidas no client, e as respostas no servidor.
Ficou Mais Facil agora neh!
Bom, Vamos para o VB
Abra o Visual Basic
Vamos começar o Servidor (o Cara que atende as solciitações)
1º Crie um novo Projeto Standard Exe
2º Adicione um controle Winsock no Formulario, (Para Adicionar, Click com o Botão direito do mouse na ToolBar, normalmente a esqueda, e selecione components, depois localize:
Microsoft Winsock Control 6.0 , selecione e aperte OK, note que apareceu 2 computadorezinhos na toolbar, adicione ele ao Formulario
Pronto, com isto ja podemos fazer conexoes com outros Computadores Via TCP/IP ou UDP
Altere as seguintes propriedades do Winsock
Name: wsSock ‘Nome do Objeto
Index: 0 ‘Numero do Indice (isso serve para podermos ter varios controles iguais no form e usalos como uma Array)
LocalPort: 1515 ‘porta que vamos conectar nosso client
3º Adicione um Text Box e altere as propriedades
Name: txtLog
MultiLine: True
ScroolBar: Vertical
Top: 120
Left: 120
Width: 4455
Height : 2895
Este vai servir para mostrarmos o que o server está recebendo e o que esta acontecendo.
Bom Vamos para o Codigo do Servidor
Dim n_Connection As Integer Private Sub Form_Load() 'ADICIONA NO LOG txtLog.Text = Now & " > Iniciando..." 'VERIFICA SE O SOCKET JA ESTA ABERTO 'AGUARDANDO NA PORTA ESPECIFICADA (1515) If wsSock(0).State <> sckClosed Then wsSock(0).Close End If 'SETA O PROTOCOLO wsSock(0).Protocol = sckTCPProtocol 'COMEÇA A AGUARDAR UMA CONEXAO wsSock(0).Listen 'MOSTRA NO TEXT QUE O SERVER FOI INICIADO 'VBCRLF: Serve para ir para outra linha no textbox txtLog.Text = txtLog.Text & vbCrLf & Now & " > Server Iniciado, Porta: " & wsSock(0).LocalPort End Sub Private Sub Form_Unload(Cancel As Integer) 'FECHA TODOS OS SOCKETS ABERTOS E FECHA O FORM For i = wsSock.UBound To wsSock.LBound Step -1 wsSock(i).Close Next i End Sub Private Sub wsSock_Close(Index As Integer) 'REMOVE UMA CONEXAO E FECHA O SOCKET 'TIRA UMA CONEXAO DO TOTAL n_Connection = n_Connection - 1 'MOSTRA NO LOG txtLog.Text = txtLog.Text & vbCrLf & Now & " > Conexao Fechada P/: " & wsSock(Index).RemoteHostIP 'DESTOY O SOCKET QUE NAO VAI MAIS SER USADO Unload wsSock(Index) End Sub Private Sub wsSock_ConnectionRequest(Index As Integer, ByVal requestID As Long) 'ESSE EVENTO É DISPARADO QUANDO ALGUEM TENTA CONECTAR 'ADICIONA +1 NA CONEXAO PARA SABERMOS QUANTAS PESSOAS TEMOS CONECTADA n_Connection = n_Connection + 1 'CRIA UM NOVO SOCKET PARA ACEITAR O USUARIO Load wsSock(n_Connection) 'ACEITA A CONEXAO COM USUARIO wsSock(n_Connection).Accept requestID 'ADICIONA NO TEXTO txtLog.Text = txtLog.Text & vbCrLf & Now & " > Conexão Aceita P/:" & wsSock(Index).RemoteHostIP End Sub Private Sub wsSock_DataArrival(Index As Integer, ByVal bytesTotal As Long) 'ESSE EVENTO ACONTECE QUANDO O CLIENT ENVIA ALGUMA COISA PRO SERVER 'CASO DE ERRO ENVIA UMA MENSAGEM PRE DEFINIDA On Error GoTo Handler 'CRIAMOS A VARIAVEL QUE VAI RECEBER OS DADOS Dim RData 'RECEBE OS DADOS DO CLIENT wsSock(Index).GetData RData, vbByte 'DESCOBRE O QUE FOI ENVIADO 'A FUNÇÃO SPLIT VAI QUEBRAR A VARIAVEL TODA VEZ QUE ENCONTRAR # 'EX 'RDATA=TESTE#123#ABC 'DEPOIS DO SPLIT VAMOS FAZER O SEGUINTE 'RData = Split(RData, "#") 'FICARIA 'RDATA(0)=TESTE 'RDATA(1)=123 'RDATA(2)=ABC RData = Split(RData, "#") Select Case CStr(RData(0)) Case "&H1" 'SE RECEBER H1 DO CLIENT (ENVIA TESTE) wsSock(Index).SendData "MSG#TESTE" 'ADICIONA NO TEXTO txtLog.Text = txtLog.Text & vbCrLf & Now & " > Recebido &H1 de: " & wsSock(Index).RemoteHostIP txtLog.Text = txtLog.Text & vbCrLf & Now & " > Enviando MSG#TESTE P/: " & wsSock(Index).RemoteHostIP Case "&H2" 'SE RECEBER H2, ENVIA 123 PRO CLIENT wsSock(Index).SendData "MSG#123" txtLog.Text = txtLog.Text & vbCrLf & Now & " > Recebido &H2 de: " & wsSock(Index).RemoteHostIP txtLog.Text = txtLog.Text & vbCrLf & Now & " > Enviando MSG#123 P/: " & wsSock(Index).RemoteHostIP Case Else 'SE NAO RECEBER NENHUM NEM OUTRO, ENVIA COMANDO INEXISTENTE wsSock(Index).SendData "MSG#NAO CONHEÇO ESTE COMANDO!" txtLog.Text = txtLog.Text & vbCrLf & Now & " > Recebido " & RData(0) & " de: " & wsSock(Index).RemoteHostIP txtLog.Text = txtLog.Text & vbCrLf & Now & " > Enviando MSG#NAO CONHEÇO ESTE COMANDO! P/: " & wsSock(Index).RemoteHostIP End Select Exit Sub Handler: txtLog.Text = txtLog.Text & vbCrLf & Now & " > Recebido " & RData(0) & " de: " & wsSock(Index).RemoteHostIP End Sub
E assim temos um programa servidor, aguardando solicitação de um client.
Nada muito complexo, so precisa ser lido com muita atenção, é usado também criptografia, na troca dos dados,
Tentem usar o exemplo de criptografia que eu ja postei, pode ser bem util para vocês começarem a usar aplicações client-server
Vamos Para o client, o client é bem mais simples.
Bom o Client eu nao comentei o código, para que vocês fuçem e se divirtam, existe alguns bugs que eu deixei de proposito, para ajudar no aprendizado por enquanto é isso ai.
Private Sub cmdConnect_Click() Timer1.Enabled = False If wsSock.State <> sckClosed Then wsSock.Close End If wsSock.Connect txtIP, txtPort Do While wsSock.State = sckConnecting DoEvents lblReg.Caption = "Conectando..." Loop Select Case wsSock.State Case sckConnected lblReg.Caption = "Conectado!" Case sckError lblReg.Caption = "Erro!" Case Else lblReg.Caption = "Disconectado" End Select cmdConnect.Enabled = False Timer1.Enabled = True End Sub Private Sub cmdH1_Click() If wsSock.State = sckConnected Then wsSock.SendData "&H1" End If End Sub Private Sub cmdH2_Click() If wsSock.State = sckConnected Then wsSock.SendData "&H2" End If End Sub Private Sub Form_Unload(Cancel As Integer) wsSock.Close End Sub Private Sub Timer1_Timer() If wsSock.State = sckConnected Then cmdConnect.Enabled = False Else cmdConnect.Enabled = True End If Select Case wsSock.State Case sckConnected lblReg.Caption = "Conectado!" Case sckError lblReg.Caption = "Erro!" Case Else lblReg.Caption = "Disconectado" End Select End Sub Private Sub wsSock_DataArrival(ByVal bytesTotal As Long) Dim rDATA wsSock.GetData rDATA, vbString rDATA = Split(rDATA, "#") If rDATA(0) = "MSG" Then MsgBox "Recebido: " & rDATA(1), vbInformation End If End Sub
A Tela do Client é igual a ésta:
Espero que gostem, em breve eu trago mais alguma coisa, quem quizer o codigo fonte me manda PM com o Email, que eu envio o codigo fonte do client e do server.
Vlws
By Sprit