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
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
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
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 >>

HOME
     


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)