CAPÍTULO
6 Programação visual com Software Livre EDIT LIN EDITORIAL S.L, dos autores Daniel Campos Fernández e José Luis Redrejo. Prólogo de Benoit Minisini |
|
<< Anterior | Próximo >> |
6.3 Um cliente TCP
|
|
Agora que
já dispomos
de
um programa servidor, vamos criar um programa
cliente.
Criaremos um programa gráfico chamado MeuCliente, com um formulário FMain, e um referencial ao componente gb.net como no caso anterior. |
![]() Figura 4.Projeto
MeuCliente
|
Dentro do
formulário Fmain
colocaremos dois controles TextBox, chamados TxtIP e TxtPorta nos quais
o usuário colocará o endereço IP e a Porta para
conectar-se; um botão chamado BtnConectar, com o
texto Conectar;
um TextBox chamado TxtDados,
no qual o usuário colocará os dados a enviar ao
servidor, e um label chamado LblResultado, no qual qual mostraremos o resultado recebido do servidor. |
![]() Figura 5. Formulário FMain. |
Também colocaremos três labels de informações com qualquer nome para informar o usuário. Ao lançar o formulário, colocaremos uns valores padrões e poremos o TextBox TxtDados desabilitado, já que de inicio o programa não está conectado ao servidor. Também colocaremos no início do código uma variável global do tipo Socket, que representa o cliente com o qual nos conectaremos ao servidor. |
|
PRIVATE Cliente AS Socket PUBLIC SUB Form_Open() TxtIP.Text = "127.0.0.1" TxtPorta.Text = "3152" TxtDados.Text = "" LblResultado.Text = "" TxtDados.Enabled = FALSE END |
|
O botão
BtnConectar terá
duas funções: se não estivermos
conectados,
tratará de conectar, e se já o estamos,
desconectará do servidor. Para isso, testamos se a
referência ao objeto Socket
é nula ou não. Por outro lado verificamos se o
dado do
endereço IP é válido, assim como o da
porta
indicada.
Para verificar o número da porta duas funções: Val(), devolve um número a partir de um texto se este conter apenas caracteres numéricos. Caso contrário, devolve NULL. Se obtivermos um número, verificamos se encontra-se entre os valores 1-65535. Para o endereço IP, empregaremos o Net.format, que retorna um endereço IP a partir de um texto, se for possível interpreta-lo como tal, caso contrário retorna uma cadeia vazia. Uma vez dispondo dos dados, criamos o objeto Sockt e tratamos de conectar com o IP e porta dados, e trocamos o texto do botão para Desconectar. No caso de que já estivermos conectado tratamos de encerrar o sockt, se estiver aberto, desabilitamos a caixa de texto de dados e levamos a NULL a referência ao objeto socket, para destruí-lo. |
|
PUBLIC
SUB BtnConectar_Click()
DIM nPorta AS Integer DIM sIP AS String LblResultado.Text = "" TxtDados.Text = "" IF Cliente = NULL THEN TRY nPorta = Val(TxtPorta.Text) IF ERROR THEN Message.Error("Número da porta não é válido") RETURN END IF IF
nPorta <
1 OR nPorta
>
65535 THEN
Message.Error("Número da porta não é válido") RETURN END IF sIP = Net.Format(TxtIP.Text) IF sIP = "" THEN Message.Error("Endereço IP não é válido") RETURN END IF Cliente = NEW Socket AS "Cliente" Cliente.Host = sIP Cliente.Port = nPorta Cliente.Connect() ELSE TRY CLOSE #Cliente Cliente = NULL TxtDados.Enabled = FALSE END IF END |
|
Entre a tentativa de conexão e a conexão real pode existir um intervalo de tempo. Para saber quando realmente estamos conectado com o servidor, empregaremos o evento Ready, que é produzido quando o servidor aceita nossa conexão. Neste evento, habilitaremos a caixa de texto de dados para que o usuário possa escrever. Também pode acontecer que ocorra um erro (por exemplo, uma conexão negada ou um nome de host não encontrado), em cujo caso dispara-se o evento Error, que aproveitamos para devolver a interface a seu estado desconectado e eliminar o socket recusado. |
|
PUBLIC SUB Cliente_Ready() TxtDados.Enabled = TRUE END PUBLIC SUB Cliente_Error() TRY CLOSE #Cliente Cliente = NULL TxtDados.Enabled = FALSE BtnConectar.Text = "Conectar" Message.Error("Conexão encerrada") END |
|
Enquanto ao envio de dados, o realizaremos quando o usuário pressionar a tecla Return, após escrever um texto na caixa TxtDados. Para isso introduziremos o código dentro de evento KeyPress da caixa de texto. |
|
PUBLIC
SUB TxtDados_KeyPress()
IF key.Code = key.Return THEN IF Len(TxtDados.Text) > 0 THEN LblResultado.Text = "" TRY WRITE #Cliente, TxtDados.Text, Len(TxtDados.Text) END IF END IF END |
|
Enquanto a
recepção de dados do servidor, pode chegar-nos em
vários fragmentos, cada um dos quais receberemos
no evento
Read do objeto socket, e mostraremos no label LblResultado.
|
|
Quando se envia ou recebe dados em uma rede, não podemos ter certeza que a quantidade de dados será recebida de uma só vez, sempre temos que levar em conta a possibilidade de unir fragmentos. | |
PUBLIC
SUB Cliente_Read()
DIM sCad AS String TRY READ #Cliente, sCad, Lof(Cliente) LblResultado.Text = LblResultado.Text & sCad END |
|
Já temos o nosso cliente pronto. Executamos o servidor que criamos anteriormente em uma ou várias instâncias deste programa para comprovar os resultados. | ![]() Figura 6.Resultado final do nosso Cliente. |
Na
hora de criar clientes e servidores para
produção,
devemos levar em conta a codificação dos
caracteres
empregados pelo servidor e o cliente. Muitos erros podem provir por
este fato, simplesmente, é que o Gambas e muitos outros
programas usam internamente UTF-8 como
codificação
predeterminada, sendo que outros empregam ISO-8859-1 ou UTF-16. Este
programa, por exemplo, pode ter problemas com o ñ e vogais
acentuadas. Podemos melhora-lo como exercício,
convertendo as
cadeias
enviadas e
recebidas entre
UTF-8 e ISO-8859-1 ou ISO-8859-15. |
|
<< Anterior | Próximo >> |
Cópia literal Extraído
do livro “GAMBAS, programação visual
com software
Livre”, da editora EDIT LIN EDITORIAL S.L, dos
autores Daniel Campos Fernández e José
Luis
Redrejo. Prólogo de Benoit
Minisini
LICENSA DESTE DOCUMENTO É
permitido a cópia e
distribuição da
totalidade ou parte desta obra sem fins lucrativo. Toda
cópia
total ou parcial devera expressar o nome do autor e da editora e
incluir esta mesma licença, adicionando se é uma
cópia literal “Cópia
literal”. Se é
autorizada a modificação e
tradução da
obra sem fins lucrativo sempre se deve constar na obra
resultante a modificação o nome da obra
original o
autor da obra original e o nome da editora e a obra resultante
também deverá ser livremente reproduzida,
distribuída, ao publico e transformada em termos similares
ao
exposto nesta licença.
Tradução Cientista (Antonio Sousa) |
|