Como trabalhar com os dados que chegam ao servidor?
Não podemos enviar os dados para o servidor de qualquer jeito, pois não saberemos identificar de qual pessoa veio ou que dados são esses.
Devemos enviar "frases" para o servidor. Estas "frases" devem conter ínicio, meio e fim.
Se eu enviar para o servidor a seguinte frase: "Hoje eu roubei pão na casa do joão"
E seguidamente enviar a frase: "Hoje eu estou com a pepeka quente"
O servidor irá armazenar essas duas mensagens em apenas uma variavel
"Hoje eu roubei pão na casa do joão Hoje eu estou com a pepeka quente"
Por esse motivo é importante que as "frases" devem conter ínicio, meio e fim.
"Frase 1, Hoje eu roubei pão na casa do joão, FIM"
"Frase 2, Hoje eu estou com a pepeka quente, FIM"
Frase 1" e "Frase 2" é o ínicio da mensagem, ou seja, o cabeçalho.
"Hoje eu roubei pão na casa do joão" é o meio, ou seja, os dados.
FIM, indica o fim da mensagem. "Ah vá, sério? não, pera, você descobriu sozinho?"
Então, se eu mandesse essas duas frases, uma seguida da outra. Ficaria assim:
"Frase 1, Hoje eu roubei pão na casa do joão, FIM Frase 2, Hoje eu estou com a pepeka quente, FIM"
Todos os dados que chegam ao servidor, vamos guardar dentro de uma variavel. Todas as mensagens são guardadas dentro de uma única variável.
Exemplo :
variavel = variavel & (dados que estão chegando no servidor)
Se eu precisar enviar os dados de um cliente com nome, rg e telefone?
Precisarei criar 3 mensagens para isso?
ClienteNome, "DragonicK", FIM
ClienteRG, "241235123", FIM
ClienteTelefone, "666-666", FIM
Se enviar as "frases" separadas (como no exemplo acima) eles não vão chegar no mesmo tempo para uma função ser executada. Por isso, é importante entender o que é um pacote de dados.
Pacote é só o nome da variável que contém todos os dados que vai para o servidor.
Todos os dados do cliente, terão que estar em uma única "frase", ou seja, um pacote.
Vamos para de usar "frase" para usar pacote, ou melhor, packet (do inglês, pacote)
packet= "Dragonic", "241235123", "666-666"
Podemos criar apenas um pacote e, adicionar algo para distinguir esses dados.
packet = CadastroCliente, "DragonicK", "SEPARAR", "241235123", "SEPARAR", "666-666", FIM
CadastroCliente = Cabeçalho (Início da pacote)
DragonicK = nome do cliente (Meio)
SEPARAR = SEPARADOR
241235123 = RG (Meio)
SEPARAR = SEPARADOR
666-666 = Telefone (Meio)
FIM = FIM ("Ah vá, sério? não, pera, você descobriu isso sozinho de novo?")
Pronto, agora podemos identificar nossos dados no servidor.
E aqui entra a parte onde manipularemos os dados que chegam ao servidor.
Com as funções Mid e InStr nós podemos pegar qualquer pedaço de um texto.
Vamos declarar 3 variaveis do tipo string.
A variável buffer será responsável por armazenar todos os dados que chegam no servidor.
A variável SEP_CHAR será o nosso separador de dados.
A variável END_CHAR será o fim da mensagem.
Agora, vamos definir as 2 variavel com algum caractere.
Para a SEP_CHAR indiquei '@' e para END_CHAR indiquei ';' (ponto e virgula)
Então, o pacotes de um cadastro de um cliente, poderia ser.
packet = ClienteCadastro @ DragonicK @ 241235123 @ 666-666 ;
Então, primeiro devemos separar todos os pacotes quebrando no ; (ponto e vírgula). Depois só nos resta quebrar esse pacotes onde há @ e joga-la dentro de um array.
dados(1) = ClienteCadastro
dados(2) = DragonicK
dados(3) = 241235123
dados(4) = 666-666
Vamos modificar o evento Data_Arrival para processar cada pacote que chega ao servidor.
Toda informação que chega ao servidor, é processada por ordem, os dados que chegaram primeiro serão processados primeiro.
Toda informação que chega ao server é colocada dentro da variável buffer. Essa variável apenas acumula as informações que chegam ao server.
Obtém a posição do primeiro caractere ; (ponto e vírgula) que está na variável buffer.
Um exemplo mais fácil de entender, "batata;"
O ponto e vírgula é o número 7, ou seja, ele é o sétimo caractere da frase. A variavel Start irá conter a posição do caractere ";" na variavel buffer.
Esse loop ficará executando até que não exista mais nenhum ";" na variavel buffer. Quando a variável Start for igual a 0, acaba o loop.
Faz uma cópia do conteúdo que está na variável buffer, mas somente do primeiro caractere até um caractere antes do ";" (Start - 1).
Pegando apenas nosso pacote, os dados que enviamos.
Já que fez uma cópia dos nosso dados para a variável packet, o pacote já pode ser removida da variável buffer.
Procura novamente se há algum ";" (ponto e vírgula) na variavel buffer para repetir novamente o processo.
Mostra o pacote recebido em uma caixa de mensagem
Agora, vamos ao cliente e adicionar as variáveis e atribuir no form_load.
Antes de continuar a editar, se você seguiu essa aula. Abra o servidor e clique em Start. Connect com o cliente ao servidor e envie o seguinte texto.
Akaruz ; Cristabel ; DragonicK;
Perceba que o servidor dividiu uma única mensagem em 3 partes, pois definimos que ; seria o final de casa mensagem.
Winsock Aula 2 - Parte 1
Voltando ao projeto, alterei o conteúdo do SEP_CHAR e END_CHAR no servidor e no cliente. Para não dar nenhum erro, se por acaso tivermos que cadastrar o email de alguém.
O servidor irá quebrar o texto em 2 partes: juliosperandio@hotmail.com se tornará em juliosperandio e hotmail.com retirando o @. Por esse motivo que o conteúdo dentro de SEP_CHAR e END_CHAR deve ser algo que nunca será usado entre os dados transmitidos.
Adicionei 4 textbox e 1 novo Command button.
No Command3, eu alterei o método para enviar a mensagem ao servidor, os separadores da mensagem já estão junto ao código, no textobox, só é necessário escrevera a mensagem desejada.
No evento click do command4, adicionei o código para enviar o texto dos 4 textbox para o servidor.
No servidor eu adicionei uma nova sub para processar os dados que são separados pelo END_CHAR.
No Data_Arriaval, troque o MsgBox pelo HandleData. Todos os dados que chegam no servidor não serão mais mostrados, serão processados pela sub HandleData
Download Winsock Aula 2 - Parte 2
http://www.mediafire.com/download/zqewrt3att437tz/Wisnock+Aula+2+-+Parte+2.rar
Próxima aula, como fazer o servidor responder.
Não podemos enviar os dados para o servidor de qualquer jeito, pois não saberemos identificar de qual pessoa veio ou que dados são esses.
Devemos enviar "frases" para o servidor. Estas "frases" devem conter ínicio, meio e fim.
Se eu enviar para o servidor a seguinte frase: "Hoje eu roubei pão na casa do joão"
E seguidamente enviar a frase: "Hoje eu estou com a pepeka quente"
O servidor irá armazenar essas duas mensagens em apenas uma variavel
"Hoje eu roubei pão na casa do joão Hoje eu estou com a pepeka quente"
Por esse motivo é importante que as "frases" devem conter ínicio, meio e fim.
"Frase 1, Hoje eu roubei pão na casa do joão, FIM"
"Frase 2, Hoje eu estou com a pepeka quente, FIM"
Frase 1" e "Frase 2" é o ínicio da mensagem, ou seja, o cabeçalho.
"Hoje eu roubei pão na casa do joão" é o meio, ou seja, os dados.
FIM, indica o fim da mensagem. "Ah vá, sério? não, pera, você descobriu sozinho?"
Então, se eu mandesse essas duas frases, uma seguida da outra. Ficaria assim:
"Frase 1, Hoje eu roubei pão na casa do joão, FIM Frase 2, Hoje eu estou com a pepeka quente, FIM"
Todos os dados que chegam ao servidor, vamos guardar dentro de uma variavel. Todas as mensagens são guardadas dentro de uma única variável.
Exemplo :
variavel = variavel & (dados que estão chegando no servidor)
Se eu precisar enviar os dados de um cliente com nome, rg e telefone?
Precisarei criar 3 mensagens para isso?
ClienteNome, "DragonicK", FIM
ClienteRG, "241235123", FIM
ClienteTelefone, "666-666", FIM
Se enviar as "frases" separadas (como no exemplo acima) eles não vão chegar no mesmo tempo para uma função ser executada. Por isso, é importante entender o que é um pacote de dados.
Pacote é só o nome da variável que contém todos os dados que vai para o servidor.
Todos os dados do cliente, terão que estar em uma única "frase", ou seja, um pacote.
Vamos para de usar "frase" para usar pacote, ou melhor, packet (do inglês, pacote)
packet= "Dragonic", "241235123", "666-666"
Podemos criar apenas um pacote e, adicionar algo para distinguir esses dados.
packet = CadastroCliente, "DragonicK", "SEPARAR", "241235123", "SEPARAR", "666-666", FIM
CadastroCliente = Cabeçalho (Início da pacote)
DragonicK = nome do cliente (Meio)
SEPARAR = SEPARADOR
241235123 = RG (Meio)
SEPARAR = SEPARADOR
666-666 = Telefone (Meio)
FIM = FIM ("Ah vá, sério? não, pera, você descobriu isso sozinho de novo?")
Pronto, agora podemos identificar nossos dados no servidor.
E aqui entra a parte onde manipularemos os dados que chegam ao servidor.
Com as funções Mid e InStr nós podemos pegar qualquer pedaço de um texto.
Vamos declarar 3 variaveis do tipo string.
A variável buffer será responsável por armazenar todos os dados que chegam no servidor.
A variável SEP_CHAR será o nosso separador de dados.
A variável END_CHAR será o fim da mensagem.
Agora, vamos definir as 2 variavel com algum caractere.
Para a SEP_CHAR indiquei '@' e para END_CHAR indiquei ';' (ponto e virgula)
Então, o pacotes de um cadastro de um cliente, poderia ser.
packet = ClienteCadastro @ DragonicK @ 241235123 @ 666-666 ;
Então, primeiro devemos separar todos os pacotes quebrando no ; (ponto e vírgula). Depois só nos resta quebrar esse pacotes onde há @ e joga-la dentro de um array.
dados(1) = ClienteCadastro
dados(2) = DragonicK
dados(3) = 241235123
dados(4) = 666-666
Vamos modificar o evento Data_Arrival para processar cada pacote que chega ao servidor.
Toda informação que chega ao servidor, é processada por ordem, os dados que chegaram primeiro serão processados primeiro.
Toda informação que chega ao server é colocada dentro da variável buffer. Essa variável apenas acumula as informações que chegam ao server.
Obtém a posição do primeiro caractere ; (ponto e vírgula) que está na variável buffer.
Um exemplo mais fácil de entender, "batata;"
O ponto e vírgula é o número 7, ou seja, ele é o sétimo caractere da frase. A variavel Start irá conter a posição do caractere ";" na variavel buffer.
Esse loop ficará executando até que não exista mais nenhum ";" na variavel buffer. Quando a variável Start for igual a 0, acaba o loop.
Faz uma cópia do conteúdo que está na variável buffer, mas somente do primeiro caractere até um caractere antes do ";" (Start - 1).
Pegando apenas nosso pacote, os dados que enviamos.
Já que fez uma cópia dos nosso dados para a variável packet, o pacote já pode ser removida da variável buffer.
Procura novamente se há algum ";" (ponto e vírgula) na variavel buffer para repetir novamente o processo.
Mostra o pacote recebido em uma caixa de mensagem
Agora, vamos ao cliente e adicionar as variáveis e atribuir no form_load.
Antes de continuar a editar, se você seguiu essa aula. Abra o servidor e clique em Start. Connect com o cliente ao servidor e envie o seguinte texto.
Akaruz ; Cristabel ; DragonicK;
Perceba que o servidor dividiu uma única mensagem em 3 partes, pois definimos que ; seria o final de casa mensagem.
Winsock Aula 2 - Parte 1
Voltando ao projeto, alterei o conteúdo do SEP_CHAR e END_CHAR no servidor e no cliente. Para não dar nenhum erro, se por acaso tivermos que cadastrar o email de alguém.
O servidor irá quebrar o texto em 2 partes: juliosperandio@hotmail.com se tornará em juliosperandio e hotmail.com retirando o @. Por esse motivo que o conteúdo dentro de SEP_CHAR e END_CHAR deve ser algo que nunca será usado entre os dados transmitidos.
Adicionei 4 textbox e 1 novo Command button.
No Command3, eu alterei o método para enviar a mensagem ao servidor, os separadores da mensagem já estão junto ao código, no textobox, só é necessário escrevera a mensagem desejada.
No evento click do command4, adicionei o código para enviar o texto dos 4 textbox para o servidor.
No servidor eu adicionei uma nova sub para processar os dados que são separados pelo END_CHAR.
No Data_Arriaval, troque o MsgBox pelo HandleData. Todos os dados que chegam no servidor não serão mais mostrados, serão processados pela sub HandleData
Download Winsock Aula 2 - Parte 2
http://www.mediafire.com/download/zqewrt3att437tz/Wisnock+Aula+2+-+Parte+2.rar
Próxima aula, como fazer o servidor responder.