END OF FILE: Tutorial Chat Em Delphi

Transcrição

END OF FILE: Tutorial Chat Em Delphi
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
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
no componente radiobutton tambem mudamos o Caption no caso eu coloquei cliente e no outro
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
depois de salvar aperte no botao compilar para gerar o executavel ou aperte menu run -> compiler
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
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;
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
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
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;
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;
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;
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
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;
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
mmo1.Lines.Add('ele: '+ Socket.ReceiveText);
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;
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
mmo1.Lines.Add('desconectado');
end;
end.

Documentos relacionados