• Nenhum resultado encontrado

END OF FILE: Tutorial Chat Em Delphi

N/A
N/A
Protected

Academic year: 2021

Share "END OF FILE: Tutorial Chat Em Delphi"

Copied!
14
0
0

Texto

(1)

END OF FILE: Tutorial Chat Em Delphi

fórum: http://endoffile.umforum.net

site: http://fts315.xp3.biz

autor: kõdo no kami (www.facebook.com/hacker.fts315) - skype: hackefts315 greetz: mmxm, sir.rafiki, suspeit0@virtual, entre outros

01/06/2014 (sem revisão)

E ae galera nesse tutorial vou ensinar como construir um chat basico em delphi 7 (embora o delphi que eu vou usar seja o d7 é possivel fazer a mesma coisa nos mais recentes), um chat é uma forma de enviar e receber dados via rede seja uma rede local ou a internet para duas ou mais pessoas se comunicar, na maioria das vezes um chat usa sockets para estabelecer uma conexao entre duas ou mais maquinas, existem pelo menos 4 maneiras de usar socket no delphi 7 tem os componentes da aba internet (tcpclient, tcpserver, udpsocket), tambem existe o compente que vem com o delphi 7 mas nao vem instalado tambem da aba internet (clientsocket e serversocket), tem o componente da aba indy client e server (idtcpclient, idudpclient, idtcpserver e idudpserver), tambem é possivel usar o socket manulmente com API do proprio sistema windows, vamos usar nesse tutorial o

clientsocket e serversocket

Indice

1 – construindo a nossa interface 2 – salvando e compilando 3 – criando o codigo 4 – incrementado o chat

5 – instalado o clientsocket e serversocket 6 – codigo fonte completo

1 – construindo a nossa interface

vamos começar construido a nossa interface, essa inteface sera composta de 3 edits da aba standards sendo um para onde vamos colocar o ip, outro para a porta, e outro para onde vamos escrever, vamos usar 2 buttons da aba standards um botao vai ser para conectar e outro para enviar no texto, 1 memo da aba standards para o texto que vamos receber, 2 radiobutton da aba standards para definir se ele vai ser o cliente ou servidor, 1 clientsocket da aba internet e 1 serversocket tambem da aba internet (o clientsocket e servesocket nao vem instalado porem vem junto), minha interface vai ficar dessa maneira voce pode deixar igual ou deixa do seu gosto

(2)

agora vamos configurar os atributos dos componentes que colocamos, vamos começar com os dois edits aperte no primeiro edit e va na aba object inspector, procure pelo atributo Text e apague tudo que estiver dentro dele e faça o mesmo com o outro edit

no componente memo procure no object inspector o atributo Lines depois de dois cliques nele (ou aperte nos ... no lado), vai abrir uma aba apaga todo texto

nos componentes button procure o atributo caption e dentro dele escrevemos o texto do botao no caso o primeiro eu escrevi conectar e no segundo enviar

(3)

servidor e um deles no atributo Checked eu coloque true (isso serve para marca um radio como o padrao porem ative isso em apenas um radio)

agora mudamos alguns atributos do form aperte em qualquer parte do form menos em um

componente depois no object inspector procure caption ali escrevemos o nome que vai ser mostrado na janela no caso coloquei "fts chat", tambem vamos evitar do usario expandir e maximimizar a janela para isso mudamos o atributo BorderStyle para bsSizeable, e BorderIcons -> biMaximimize colocamos false

2 – salvando e compilando

antes de compilar para testar vamos salvar o projeto, para salvar um projeto no delphi basta apertar no menu file -> save all e por fim escolher um local onde salvar

(4)

depois de apertar no botao compilar ele vai automaticamente gerar o executavel e abrir ele (voce pode abrir pelo executavel no diretorio onde esta salvo tambem)

3 – criando o codigo

ate agora nosso programa tem apenas a interface grafica porem ele nao faz nada, temos que criar a parte do codigo que vai fazer a conexao no caso do cliente ou esperar a conexao no caso do

servidor, apertamos no componente button que vai ativar a conexao (no caso é o botao conectar), no object inspector em eventos damos dois cliques no onClick (esse evento serve para quando alguem apertar o botao ele executa determinado codigo), vai ser gerado procedimento dentro do escopo begin e end colamos o nosso codigo

(5)

assim que a gente apertar no botao o programa deve saber se vai conectar como cliente ou servidor, para isso vamos usar uma condição if e ver qual é radiobutton que esta selecionado (vou evitar o uso de imagem nessa parte de codigo para ficar mais legivel), o meu componente radiobutton se chama rb1 (esse é o cliente) e outro rb2 (esse é o servidor), o codigo abaixo eu digo para o

programa executar o primeiro escopo caso o checked do primeiro radiobutton seja true (ou seja eles estiver selecionado), se nao ele executa o segundo escopo (os radiobutton apenas um pode esta selecionado dentro de um painel ou seja se o primeiro radiobutton nao estiver selecionado isso quer dizer que é o segundo), dentro do escopo do if eu configuro o cliente e dentro do escopo do else eu configuro o servidor

procedure TForm1.btn1Click(Sender: TObject); begin

if(rb1.Checked = true) then begin end else begin end; end;

vamos primeiro configurar o cliente, no escopo do if a gente atribui para o host do clientsocket o mesmo texto que esta dentro do primeiro edit que seria o ip, e para o atributo port atribuimos o segundo edit que seria a porta (porem na porta temos que converte o tipo string para inteiro), tambem ativamos o cliente atribuido true para o atributo active

procedure TForm1.btn1Click(Sender: TObject); begin

if(rb1.Checked = true) then begin

ClientSocket1.Host := edt1.Text;

ClientSocket1.Port := StrToInt(edt2.Text); ClientSocket1.Active := True;

(6)

end else begin end; end;

agora o servidor fazemos o mesmo, porem ao inves de usar o componente clientesocket usamos o componente serversocket, nele so precisamos definir a porta e ativa-lo

procedure TForm1.btn1Click(Sender: TObject); begin

if(rb1.Checked = true) then begin ClientSocket1.Host := edt1.Text; ClientSocket1.Port := StrToInt(edt2.Text); ClientSocket1.Active := True; end else begin ServerSocket1.Port := StrToInt(edt2.Text); ServerSocket1.Active := True; end; end;

no evento onClientRead do componente serversocket, adicionamos um codigo para pegar o texto recebido e atribuir ele ao memo (para pegar o texto usamos Socket.ReceiveText do componete serversocket)

procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);

begin

mmo1.Lines.Add('ele: '+ Socket.ReceiveText); end;

no evento onRead do componente clientesocket fazemos o mesmo que anterior so que usado o clientsocket

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);

begin

mmo1.Lines.Add('ele: '+ Socket.ReceiveText); end;

os dois codigos anteriores diz ao programa que quando eles receber os texto da outra pessoa vai adicionar o texto no memo, agora vamos fazer o oposto que é enviar o texto do cliente para o servidor ou vice versa, no evento onclick do botao que vai enviar colocamos a mesma condição if para saber se é o servidor ou cliente

procedure TForm1.btn2Click(Sender: TObject); begin

(7)

if(rb1.Checked = true) then begin end else begin end; end;

no caso vamos usar o metodo Socket.SendText no clientsocket, passamos como argumento para ele o texto que vamos enviar ou seja o edit onde escrevemos o nosso texto, tambem escrevemos o mesmo texto no memo e por fim limpamos o edit para novos textos

procedure TForm1.btn2Click(Sender: TObject); begin

if(rb1.Checked = true) then begin ClientSocket1.Socket.SendText(edt3.Text); end else begin end; mmo1.Lines.Add('voce: '+edt3.Text); edt3.Text := ''; end;

no caso do servidor tambem podemos usar apenas o Socket.SendText igual o cliente porem as vezes da erro de socket se nao especificar para qual conexao estamos enviando para evitar isso usamos o Connections seguido do numero 0 como index (caso seu chat vai ter mais de uma conexao vc vai alternando esse numero), e por fim usamos o SendText com o texto da edit que vamos enviar

procedure TForm1.btn2Click(Sender: TObject); begin

if(rb1.Checked = true) then begin ClientSocket1.Socket.SendText(edt3.Text); end else begin ServerSocket1.Socket.Connections[0].SendText(edt3.Text); end; mmo1.Lines.Add('voce: '+edt3.Text); edt3.Text := ''; end;

O chat ta pronto agora basta testar (nao precisa testar em duas maquinas voce pode digitar o ip de loopback que é 127.0.0.1 ou pelo host localhost), no caso aqui eu usei uma maquina virtual que eu uso para analise de malware

(8)

4 – incrementado o chat

agora que a gente ja viu a parte basica de conexao vamos incrementar um pouco mais ele, primeiro vamos fazer um botao para desconectar (obs: eu nao esqueci dele nao ta kkkkkk), do lado do conectar colocamos um novo button de dentro do evento onclick dele colocamos o codigo para mudar o atributo Active para False tanto do ClientSocket quanto do ServerSocket

procedure TForm1.btn3Click(Sender: TObject); begin

ClientSocket1.Active := False; ServerSocket1.Active := False; end;

outra coisa que seria legal e desabilitar os edits o botao de conectar e radios para evitar da pessoa ficar mexendo nele quando o chat ja estiver conectado, so lembrando para nao desabilitar o memo o edit e o botao que vamos usar para enviar ne, para desabilitar colocamos false nos atributos Enabled de todos eles (podemos colocar o codigo no evento do botao conectar)

procedure TForm1.btn1Click(Sender: TObject); begin

if(rb1.Checked = true) then begin

ClientSocket1.Host := edt1.Text;

(9)

ClientSocket1.Active := True; end else begin ServerSocket1.Port := StrToInt(edt2.Text); ServerSocket1.Active := True; end; edt1.Enabled := false; edt2.Enabled := false; rb1.Enabled := false; rb2.Enabled := false; btn1.Enabled := false; end;

fazemos o oposto no botao desconectar habilitamos denovo os botoes e edits procedure TForm1.btn3Click(Sender: TObject);

begin ClientSocket1.Active := False; ServerSocket1.Active := False; edt1.Enabled := true; edt2.Enabled := true; rb1.Enabled := true; rb2.Enabled := true; btn1.Enabled := true; end;

outra coisa boa seria quando alguem se conectar no servidor ou cliente ele adicione uma mensagem de conectado no memo, no ServerSocket basta coloca no evento onClientConnected e no

ClientSocket basta colocar no evento OnConnect, tambem podemos colocar para mostrar uma caso desconecte no evento onDisconnect do cliente e no servidor no evento onClientDisconnected

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);

begin

mmo1.Lines.Add('conectado'); end;

procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);

begin

mmo1.Lines.Add('conectado'); end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket);

begin

mmo1.Lines.Add('desconectado'); end;

(10)

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);

begin

mmo1.Lines.Add('desconectado'); end;

5 – instalando o client socket e serversocket

no delphi não vem instalado o componente clientsocket e serversocket, para instalar ele basta apertar no menu component e depois install package

na nova aba aperte em add e procure a pasta que seu delphi esta instalado dentro dele tem uma pasta bin (meu caso é no endereço C:\Program Files\Borland\Delphi7\Bin), dentro dessa pasta tem o componente dclsockets70.bpl abra ele e aperte ok

(11)

depois olhe na aba internet para ver se eles foram instalados

6 – codigo fonte completo

voce tambem pode baixar a source pelo forum ou no site unit Unit1;

interface uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ScktComp; type TForm1 = class(TForm) edt1: TEdit; mmo1: TMemo; btn1: TButton; edt2: TEdit; rb1: TRadioButton; rb2: TRadioButton; edt3: TEdit; btn2: TButton; ClientSocket1: TClientSocket; ServerSocket1: TServerSocket; btn3: TButton;

(12)

procedure btn1Click(Sender: TObject);

procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);

procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); procedure btn2Click(Sender: TObject);

procedure btn3Click(Sender: TObject);

procedure ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);

procedure ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);

procedure ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket);

procedure ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject); begin

if(rb1.Checked = true) then begin ClientSocket1.Host := edt1.Text; ClientSocket1.Port := StrToInt(edt2.Text); ClientSocket1.Active := True; end else begin ServerSocket1.Port := StrToInt(edt2.Text); ServerSocket1.Active := True; end; edt1.Enabled := false; edt2.Enabled := false; rb1.Enabled := false; rb2.Enabled := false; btn1.Enabled := false; end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);

begin

(13)

end;

procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);

begin

mmo1.Lines.Add('ele: '+ Socket.ReceiveText); end;

procedure TForm1.btn2Click(Sender: TObject); begin

if(rb1.Checked = true) then begin ClientSocket1.Socket.SendText(edt3.Text); end else begin ServerSocket1.Socket.Connections[0].SendText(edt3.text); end; mmo1.Lines.Add('voce: '+edt3.Text); edt3.Text := ''; end;

procedure TForm1.btn3Click(Sender: TObject); begin ClientSocket1.Active := False; ServerSocket1.Active := False; edt1.Enabled := true; edt2.Enabled := true; rb1.Enabled := true; rb2.Enabled := true; btn1.Enabled := true; end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject; Socket: TCustomWinSocket);

begin

mmo1.Lines.Add('conectado'); end;

procedure TForm1.ClientSocket1Connect(Sender: TObject; Socket: TCustomWinSocket);

begin

mmo1.Lines.Add('conectado'); end;

procedure TForm1.ClientSocket1Disconnect(Sender: TObject; Socket: TCustomWinSocket);

begin

mmo1.Lines.Add('desconectado'); end;

(14)

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket); begin mmo1.Lines.Add('desconectado'); end; end.

Referências

Documentos relacionados

Foi aplicado no controle de quatro equipamentos elétricos residenciais, através de dispositivo portátil capaz de controlar diversos equipamentos através da

Em relação à variável preços dos produtos, 94% dos clientes da amostra pesquisada estão satisfeitos, sendo que apenas 2% não está satisfeito com os preços dos produtos

O caso em questão relaciona-se a uma criança de três anos, dez meses e sete dias, que iniciou o processo diagnóstico com atendimento em consultório psicopedagógico, de abril

Embora não exista uma explicação consensual sobre este tema, a frequência de comportamentos hiporresponsivos em resposta a estímulos sociais é mais prevalente em crianças com

Marcadores de células da crista neural mostram que o osso frontal , o osso esfenóide, parte do osso interparietal, parte da porção escamosa do osso temporal e o mesênquima da

Os doentes aleatorizados no programa ACTIVE foram aqueles que apresentavam FA documentada, isto é, ou FA permanente ou pelo menos 2 episódios de FA intermitente nos 6 meses

ATENÇÃO: Se voce e sua agremiações não quitou a anuidade de 2015, então não considere esta puntuação para premiação do Ranking.. CATEGORIA INFANTIL - 08/09 ANOS

AS INFORMAÇÕES SOBRE SEGURANÇA DO PRODUTO REQUERIDAS PARA SUA UTILIZAÇÃO NÃO ESTÃO INCLUÍDAS NESTE DOCUMENTO. ANTES DE MANUSEÁ-LO, LEIA AS FICHAS TÉCNICA E DE SEGURANÇA