Você está na página 1de 4

Apostila de Sockets PARTE 2 iniciando o projeto

Enquanto isso na sala da justia.... Salve salve caro leitor, olha eu aqui de novo =) Agora vamos partir pra pratica porque isso que o povo gosta e isso que o povo quer. Abriu o Delphi? Beleza ento vamos comear montando o servidor. E vamos comear montando o GC! o que GC? My brother eu inventei isso agora pra economizar linha o Gerenciador de Conexes. Na verdade uma rotina.

Explicando o GC O GC vai ser responsvel pela aquela coisa que falei na apostila passada lembra? Gernciar as conexes. A ideia fazer com que cada conexo que entre daremos a ela um identificador. Um ponteiro no nosso caso. De regra basica temos que SEMPRE QUE ENTRAR ALGUEM IDENTIFICO ELE COM UM ENDEREO DE MEMORIA e como contra regra temos SEMPRE QUE SAIR ALGUEM LIBERAMOS O PONTEIRO A ELE ASSOCIADO. Lembre-se que estamos somente a nivel de servidor (TServerSocket). Mas pq isso importante? Bem se voc j procurou documentao sobre sockets na internet, apostilas, tutorias, exemploes em fim percebeu que muitos fazem apenas chats com apenas dois usurios. Mas pq isso? Pq o metodo mais simples de implementar. Ora Se so tem um pessoa conectada no servidor perfeitamente obvio que o servidor vai sempre mandar a informao para a conexo 0 ZERO. Suponha que voc tenha dois. E precisa informar a somente um deles q ele por exemplo seu nick j esta sendo usado. Como voc vai saber qual o numero da conexo dele se isso muda sempre que alguem entrar ou sair e depende da posio que ele est em relao a voc? Agora podemos continuar.... Ento coloque o componente TserverSocket e observe os eventos 3 eventos que iremos utilizar. onClientConect e onClientDisconect e onClientRead. Eles so disparados sempre que alguem conecta e desconecta ou manda alguma informao para o servidor respectivamente. nestes eventos que vamos atualizar nosso GC. Sempre que alguem entrar pegaremos um ponteiros para identificalo e sempre que o mesmo sair. Procuraremos na nossa lista de ponterios e apageremos ele. Assim vamos manter nosso array de ponteiros sempre igual ao das conexes. Para tanto declare uma variavel globar assim Var Conexoes : Tlist; // Tlist pra quem no sabe uma lista de ponterios. Tomaremos alguns cuidados antes de usar esta variavel. No evento onCreate do seu Form inicie a variavel deste modo: Conexoes := Tlist.Create; E no onDestroy do form destrua-o Conexoes.Destroy;

No evento onClienntConect Pra facilitar nossa vida mudaremos a propriedade name do ServerSocket1 para MeuServidor beleza? Por consequencia ficaremos com um cabealho de funo assim: procedure TFPrincipal.MeuServidorClientConnect(Sender: TObject; Socket: TCustomWinSocket); E iremos adicionar os seguintes codigos..... Var IDsocket : ^String; // Variavel utilizada par identificar o sockets begin New(IDSocket); Socket.Data := IDSocket; Conexoes.Add(Socket.data); end; Mole isso n verdade? Se voc precissar de mais explicaes mande-me um e-mail. jnelson3@ig.com.br Ok! Agora faremos o oposto certo? Iremos direto para o evento onClientDisconnect procedure TFPrincipal.MeuServidorClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); Var NumConex : integer; Begin NumConex := Conexoes.IndexOf(Socket.Data); if NumConex >= 0 then Begin Conexoes.Delete(NumConex); Dispose(Socket.Data); end; end; Caracas era so isso o GC? Cara tenho que confessar.......era =) Espero q voc tenha intendido esses conceito. Pronto GC concludo =) Manha d+ n verdade? Pois Agora vamos montar um ECO. Como assim um ECO. Vamos testar nosso GC Criaremos um tratamento simples para as menssagens que chegarem no evento onClientRead. Chamei de ECO pq tudo que o cliente enviar para o servidor ele vai retornar. Mas faremos uma brincadeira. Retornaremos sempre em minusculos. E para isso usaremos a funo AnsiLowerCase(String):String

No evento onClientRead procedure TFPrincipal.MeuServidorClientRead(Sender: TObject; Socket: TCustomWinSocket); var msg : string; NumConex : integer; begin NumConex := Conexoes.IndexOf(Socket.Data); if NumConex >= 0 then Begin msg := socket.ReceiveText; // pego a menssagem q chegou msg := AnsiLowerCase(msg); // transformo todas as letras para minuscula MeuServidor.Socket.Connections[NumConex].SendText(msg); //envio d volta pra // // quem enviou end; end; Pronto! Ta criado um servidor ainda besta mas que gerencia as conexes de uma forma muito simpatica =) Bora testar? Antes de compilar adicione no FPrincipal um boto e no seu evenco onClick escreve algo assim Begin MeuServidor.Active := not MeuServidor.Active; If MeuServidor.Active then Button1.Caption := Desligar Else Button1.Caprtion :=Ligar End; E para Criar o Cliente Voc pode fazer assim Coloque um Tedit e um Tmemo e um boto Sempre que o boto for clicado Evnvie o conteudo do Edit para o servidor e sempre que chegar algo adicione um linha no Tmemo observe q a menssagem so vai para o aplicatico de mandou mesmo tento 2 ou mais clientes na mesma maquina. lindo....... Alguns Codigos para que posso ajudar voc Recebendo resposta.... procedure TFNk_Chat.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); Var Msg : String; Begin msg := socket.ReceiveText; memo1.lines.add(msg); End; Para enviar ... clientsocket1.Socket.SendText(Edit1.Text);

Lembre-se que voc tem que por o IP do servidor no cliente na propriedade adderss as portas tem que ser iguais e primeiro obvio que o Servidor tem que estar ativo. No Cliente voc tambm tem que ativar.

Bom acabei a parte 2 =) Espero que tenha gostado. Lembro que meu e-mail est aberto para criticas, duvidas, sugestes e opinies. (jnelson3@ig.com.br) Se algum tiver interesse em publicar na revista ClubeDelphi ou em Sites basta me avisar antes =) Um muito obrigado para voc aguarde a parte 3 porque estaremos comeando a montar um simples protocolo..... Sou Joo Nelson Lima, Desenvolvedor de sistemas em Delphi. Atualmente moro em Braslia tenho 20 anos e estou desenvolvendo um sistema em P2P alem de outros trabalhos.