Criando um Chat no DELPHI utilizando Sockets

16 agosto, 2006 118 Comentários »

CRIANDO UM SISTEMA DE CHAT NO DELPHI

Faculdade de Alagoas (FAL)
Thiago Nascimento Melo. 3º Período.

Este é um pequeno tutorial que mostra como criar um simples sistema de CHAT, utilizando o TClientSocket e o TServerSocket, exemplificando como funciona um sistema Cliente/Servidor.

OBS: Não vou explicar neste tutorial como se coloca componentes, como renomeia e outras coisas básicas de Delphi que o Prof. Luiz Olivio explicou na sala. Este tutorial ensina apenas como utilizar os componentes do Delphi para criar um sistema de Chat (Cliente/Servidor).

Introdução
Eu estava procurando no DELPHI algum exemplo de algum sistema que utilizasse a arquitetura cliente/servidor. O mais prático que encontrei para um melhor entendimento foi os exemplos de CHAT encontrados na pasta DEMO/Internet/Chat do Delphi. (Existe outra pasta chamada NETCHAT, mas não olhei direito o que era).

Nas pasta CHAT, contem um pequeno projeto de um CHAT, que é cliente e servidor ao mesmo tempo, que utiliza Winsocket e também existe 2 pastas dentro chamadas Client e Server. No conteúdo destas pastas existe um sistema de Chat Cliente/Servidor completo, porem estes utilizam outro componente chamado TcpClient e TcpServer o que eu ainda não estudei direito.

Quando eu testei os sistemas, reparei que o sistema mais simples (Winsocket) suporta apenas uma comunicação Ponto-a-Ponto, isto quer dizer, o servidor suporta apenas 1 conexão. Neste caso ficou difícil entender então resolvi pesquisar na internet e desenvolver outro Chat utilizando Winsocket.

1ª Etapa
Para começar o Chat vamos criar a sua interface, neste caso adicione no programa os seguintes componentes:

Inserindo:
TMemo => Coloque o nome como Quadro.
Tmemo => Com nome de Status.

TGroupBox => Coloque o nome como C_Comandos
TEdit => Coloque dentro do TGroupBox (C_Comandos) com o nome de C_Texto
TEdit => Com nome de Host.
TEdit => Com nome de Apelido.
TButton => Com nome de Conectar.

TButton => Com nome de Servir.
2 Tlabel => Com caption Servidor e Apelido.

Agora adicione os seguintes componentes.
TclientSocket => Com nome de S_Cliente.
TserverSocket => Com nome de S_Server.

(VEJA FIGURA AO LADO)

Agora renomeie o Form1 para ChatFal. (Clique no Form depois vá em name e mude).

Vamos tentar deixar o Object Treeview mais ou menos assim:

Pronto agora tente organizar desta forma:

2ª Etapa

Bom nesta etapa vamos começar a programar o chat.

a) O primeiro evento que o programa irá executar será o TchatFal.FormCreate, clique 2x no formulário, e deixe este procedimento assim:

    
procedure TChatFal.FormCreate(Sender: TObject); {Limpa o quadro}
    begin
        Quadro.Text := '';
    end;

Explicação:

Com isto, assim que o formulário inicie, o conteúdo do componente QUADRO será apagado.

b) O segundo evento a ser programado será do componente C_Texto. Aqui vamos criar uma [i]procedure[/i] para o evento OnKeyDown (Este evento ocorre quando um texto for digitado na Tedit).

Primeiro se declara a procedure.

procedure C_TextoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

Depois vamos programar a procedure.

procedure TChatFal.C_TextoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin

        if Key = VK_Return then
            begin
                S_Cliente.Socket.SendText(C_Texto.Text + '::::' + Apelido.Text);
                C_Texto.Text := '';
            end;
    end;


Explicação:
Nos criamos uma procedure que utiliza uma variável “Key” do tipo Word, e declaramos também o uso do Shift (Se não declarar o uso do shift não funciona).

 if Key = VK_Return then => Se a tecla digitada for igual ao [ENTER] então execute.

S_Cliente.Socket.SendText(C_Texto.Text + '::::' + Apelido.Text); => Envia o texto para o servidor no formato (Mensagem::::Apelido) este formato será explicado mais na frente.

 C_Texto.Text := ''; => Limpa o conteúdo da TEdit C_Texto.

c) Vamos programar a procedure do terceiro evento. Este será para o botão “Conectar” onde ao clicar o programa irá pegar o conteúdo da Tedit “Host” e tentar conectar-se.

Clique 2x em cima do botão Conecta, e deixe da seguinte forma:

procedure TChatFal.ConectarClick(Sender: TObject);
    begin
        if S_Cliente.Active then
            begin
                S_Cliente.Active := False;

                Conectar.Caption := 'Conectar';
            end
         else begin
                S_Cliente.Host := Host.Text;
                S_Cliente.Active := True;
        end;

    end;

Explicação:

if S_Cliente.Active then => Primeiro verificamos se o TclientSocket esta ativo (isto é se a conexão já esta ativa).

 S_Cliente.Active := False; => Se tiver ativo ele desativa (Desconecta).

Conectar.Caption := 'Conectar'; => Altera o caption do TButton (Conectar) para 'Conectar'.

 else begin => Caso a conexão já esteja desativada, isto é S_Cliente.Active = False então ele vai se conectar.

 S_Cliente.Host := Host.Text; => Pega o conteudo de Host isto é o endereço IP do servidor, e coloca na propriedade Host do componete S_Cliente.

S_Cliente.Active := True; => Ativa a conexão.

3ª Etapa

Agora vamo programar os eventos do conexão do Lado Cliente.

Primeiro declare os procedimentos abaixo:

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

procedure S_ClienteDisconnect(Sender: TObject; Socket: TCustomWinSocket);
procedure S_ClienteError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure S_ClienteRead(Sender: TObject; Socket: TcustomWinSocket);

Estes são os eventos do componente TclientSocket que colocamos no programas e renomamos para S_Cliente.

Agora vamo programa-los um por um.

Primeiro OnConnect.

procedure TChatFal.S_ClienteConnect(Sender: TObject; Socket: TCustomWinSocket);
    begin
        Status.Lines.Add('Cliente ::> Conectado a: ' + S_Cliente.Host);
        Conectar.Caption := 'Desconectar';

        Apelido.Enabled := False;
        S_Cliente.Socket.SendText('NICK::::' + Apelido.Text);
    end;

Explicação:
Este evento somente ocorre quando há sucesso de conexão, isto é logo após estabelecer conexão com o servidor sem erros.

 Status.Lines.Add('Cliente ::> Conectado a: ' + S_Cliente.Host); => Aqui escrevemos no status Status.Lines.Add uma mensagem informando o cliente que ele teve sucesso na conexão.

 Conectar.Caption := 'Desconectar'; => Muda-se o caption do TButton (Conectar) de 'conecta'r para 'desconectar', pois agora sua função será encerrar a conexão.

Apelido.Enabled := False; => Depois desabilitamos o Tedit do Apelido (Apenas para o cliente não mudar de apelido durante a conexão o que não afeta nada caso mude).

S_Cliente.Socket.SendText('NICK::::' + Apelido.Text); => Enviamos para o servidor um Texto seguindo o mesmo formato que a procedure de escrever S_Cliente.Socket.SendText. Repare que desta vez o formato muda um pouco, antes era (Mensagem::::Apelido) agora é (NICK::::Apelido). Isto serve para diferenciar o tipo de mensagem, a primeira é uma mensagem normal, a segunda informa que você entrou no servidor.

O Tratamento desses formatos fica no lado do servidor que veremos em breve.

Segundo evento é o OnDisconnect.

procedure TChatFal.S_ClienteDisconnect(Sender: TObject; Socket: TCustomWinSocket);
    begin
        Status.Lines.Add('Cliente ::> Desconectado ');

        Conectar.Caption := 'Conectar';
        Apelido.Enabled := True;
    end;

Explicação:

Este evento é o oposto do evento anterior, ele somente é executado quando a conexão é desfeita.

Status.Lines.Add('Cliente ::> Desconectado '); => Informamos ao cliente com uma mensagem no status Status.Lines.Add.

Conectar.Caption := 'Conectar'; => Mudamos o caption do TButton (Conectar) para "conectar".

Apelido.Enabled := True; => Habilitamos a TEdit (Apelido).

Terceiro evento é o OnError.

procedure TChatFal.S_ClienteError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    begin
        Status.Lines.Add('Cliente ::> ERRO ao tentar conectar a: ' + S_Cliente.Host);

    end;

Explicação:

Bastante simples, em caso de erro de conexão informa no status a mensagem ERRO ao tentar conectar a: ' + S_Cliente.Host.

Quarto e ultimo evento da TclientSocket, OnRead.

procedure TChatFal.S_ClienteRead(Sender: TObject; Socket: TCustomWinSocket);
    begin
        Quadro.Lines.Add(Socket.ReceiveText);
    end;

Explicação:
Este evento ocorre quando o TClientSocket recebe dados através da conexão ativa. Como a mensagem já vem formatada pelo servidor basta apenas adicionar no quadro  Quadro.Lines.Add(Socket.ReceiveText); .

Pronto aqui finalizamos a programação do lado Client do nosso chat.

EDITANDO AS PROPRIEDADES DO COMPONETE TClientSocket (S_Cliente).

Agora vamos parar um pouco a programação, e vamos alterar as propriedades do nosso componente TclientSocket. Onde aqui vamos configurar a porta de comunicação e também vamos colocar os eventos que programamos nos seus devidos lugares.

Primeiro selecione o ícone do componente TclientSocket (S_Cliente) no formulário, depois vá na janela do “Object Inspector” e em propriedades coloque Active em FALSE (Para iniciar desconectado) e em Port abaixo de Name coloque a seguinte porta (666) ou outra que você quiser e que não esteja sendo usada pelo sistema.

Agora vá na aba Eventos e configure os eventos como esta abaixo na IMG.

Pronto o lado cliente já esta pronto agora vamos programar o lado servidor do nosso chat.

4ª Etapa

Nesta etapa vamos primeiro programar o evento do TButton "Servir" (Eu coloquei a caption deste botão como (Iniciar Servidor).

Clique 2x no botão para programar o evento.

procedure TChatFal.ServirClick(Sender: TObject);
    begin
        if S_Server.Active = True then
            begin
                S_Server.Active := False;

                Status.Lines.Add('Servidor ::> Servidor Desligado!');
                Servir.Caption := 'Iniciar Servidor';
                S_Cliente.Active := False;
                Host.Enabled := True;
                Conectar.Enabled := True;

            end
        else begin
                S_Server.Active := True;
                Servir.Caption := 'Parar Servidor';
                Host.Enabled := False;
                Conectar.Enabled := False;

                S_Cliente.Host := '127.0.0.1';
                S_Cliente.Active := True;
            end;
    end;

Explicação:
Primeiro da mesma forma que o botão de conectar primeiro verificamos o estado do servidor. Se ele está servindo ou esta parado.

  if S_Server.Active = True then => Caso esteja ativo, isto é caso ele esteja esperando conexões na porta configurada, então vamos desligar.

S_Server.Active := False; => Desliga o servidor.

Status.Lines.Add('Servidor ::> Servidor Desligado!'); => Informa no status que o servidor foi desligado.

Servir.Caption := 'Iniciar Servidor'; => Muda o caption do TButton (Servir) para 'iniciar servidor'.

S_Cliente.Active := False; => Desativa a conexão do cliente. (Ao iniciar o servidor automaticamente o programa se conecta ao servidor).

 Host.Enabled := True; => Abilita o campo de escolha do IP.

Conectar.Enabled := True; => Abilita o botão de conectar.

else begin => Caso o servidor não esta ativo, então ative.

S_Server.Active := True; => Ativa o servidor, e neste momento o servidor fica esperando conexões na porta configurada.

Servir.Caption := 'Parar Servidor'; => Muda o caption do TButton (Servir) para 'parar servidor' pois sua função agora é parar.

Host.Enabled := False; => Desativa o campo de escolha do IP (O cliente vai se conectar no localhost).

 Conectar.Enabled := False; => Desativa o botão de conectar, pare evitar desconexão do cliente com o servidor local.

 S_Cliente.Host := '127.0.0.1'; => Força o host do S_Cliente para localhost (127.0.0.1).

 S_Cliente.Active := True; => Conecta no servidor como cliente.

O IP '127.0.0.1' Corresponde a própria maquina, neste caso ao ligar o servidor ele também se conecta como cliente e desabilita as opções de conexão, caso desligue o servidor ele também se desconecta.

Agora o passo seguinte e declarar os procedimentos dos eventos do S_Server.

procedure S_ServerListen(Sender: TObject; Socket: TCustomWinSocket);
procedure S_ServerClientConnect(Sender: TObject; Socket: TCustomWinSocket);

procedure S_ServerClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
procedure S_ServerClientRead(Sender: TObject; Socket: TcustomWinSocket);

Os eventos são parecidos com os eventos do S_Cliente com diferença que não usa o evento OnError e agora existe o evento OnListen.

Vamos aos eventos.

Primeiro o evento OnListen.

procedure TChatFal.S_ServerListen(Sender: TObject;
Socket: TCustomWinSocket);
    begin
        Status.Lines.Add('Servidor ::> Servidor Ligado!');
    end;

Explicação:
Este evento ocorre quando o servidor é ligado, isto é quando ele começar a escutar na porta determinada. Quando isto ocorre ele simplesmente escreve no status a mensagem de que o servidor está ligado.
Status.Lines.Add('Servidor ::> Servidor Ligado!');

Segundo evento será o OnClientConnect.

procedure TChatFal.S_ServerClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
    begin
        Status.Lines.Add('Servidor ::> Usuário Conectado => '+ Socket.RemoteAddress);

     end;

Explicação:

Este evento ocorre quando o servidor recebe uma conexão de algum cliente. Quando isto ocorrer vamos escrever no status do servidor uma mensagem informando que um novo usuário se conectou e qual seu IP (Socket.RemoteAddress).

Status.Lines.Add('Servidor ::> Usuário Conectado => '+ Socket.RemoteAddress

Terceiro evento será o OnClientDisconnect.

procedure TChatFal.S_ServerClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);

    begin
        Status.Lines.Add('Servidor ::> Usuário Desconectado => '+ Socket.RemoteAddress);
    end;

Explicação:
Este evento ocorre quando o servidor termina uma conexão de algum cliente. Quando isto ocorrer vamos escrever no status do servidor uma mensagem informando que o usuário se desconectou e qual seu IP (Socket.RemoteAddress).
Status.Lines.Add('Servidor ::> Usuário Desconectado => '+ Socket.RemoteAddress);

Quarto e mais importante evento OnClientRead.

procedure TChatFal.S_ServerClientRead(Sender: TObject;
Socket: TCustomWinSocket);
    var texto: array[0..1] of string;
    temptexto: string;
    Index: integer;
    begin

        temptexto := Socket.ReceiveText;
        texto[0] := Copy(temptexto, 1,Pos('::::', temptexto) -1);
        texto[1] := Copy(temptexto, Pos('::::', temptexto) + Length('::::'),Length(temptexto));
        if texto[0] = 'NICK' then {Verifica se a mensagem eh de entrada}
            begin

                WITH S_Server.Socket DO BEGIN {Se a msg for de entrada avisa a todos os clientes quem entrou }
                    FOR Index := 0 TO ActiveConnections-1 DO BEGIN
                        Connections[Index].SendText(texto[1] + ' entrou na sala: ');
                    END;
                END;
            end

        else

            begin
                WITH S_Server.Socket DO BEGIN {Se nao for de entrada, então eh msg normal, no caso passa para todos a msg}
                    FOR Index := 0 TO ActiveConnections-1 DO BEGIN
                        Connections[Index].SendText('(' + texto[1] + ') escreveu: ' + texto[0]);
                    END;
                END;

                Status.Lines.Add('Servidor ::> ' + texto[1] + ' (' + Socket.RemoteAddress + ') escreveu: '+ texto[0]);
            end;

end;


Explicação

Este evento é o mais importante do chat, pois é nele que realmente o chat irá funcionar. O evento ocorre quando o servidor recebe dados do cliente, neste caso ele terá que receber a mensagem e repassar para todos os clientes conectados (Broadcasting).

Esta parte foi difícil desenvolver, pois no exemplo que vem no Delphi (WinSocket) ele não envia para todos os usuários a mensagem, ele apenas adiciona na Memo a informação recebida.

Depois de uma boa pesquisada no GOOGLE sobre WinSocket eu achei uma solução funcional.

Bom vamos passo a passo do código.

var texto: array[0..1] of string; => Este array será necessária para formatação dos dados.

 temptexto: string; => Está variável será necessária para formatação dos dados.

 Index: integer; => Variável de controle para o loop de broadcast.

temptexto := Socket.ReceiveText; => Variável temptexto recebe os dados enviados pelo cliente Socket.ReceiveText.

 texto[0] := Copy(temptexto, 1,Pos('::::', temptexto) -1); => Separa a informação em duas partes, texto[0] pega tudo que estiver antes do separador '::::' (Lembre-se do formato de envio). OBS: Procure no HELP do Delphi explicações sobre as funções Pos, Length e Copy. Pois são muito uteis.

texto[1] := Copy(temptexto, Pos('::::', temptexto) + Length('::::'),Length(temptexto)); => Aqui texto[1] pega tudo que estiver depois do separador '::::'.

if texto[0] = 'NICK' then => Se o que estiver antes de '::::' for NICK então foi mensagem de entrada.

 WITH S_Server.Socket DO BEGIN => Bom aqui eu estou dizendo que com o Objeto S_Server.Socket Faça. No help do Delphi tem uma explicação sobre 'WITH'.

 FOR Index := 0 TO ActiveConnections-1 DO BEGIN=> Um laço usando FOR, até o final das conexões. (ActiveConnections vem do objeto S_Server através do WITH).

Connections[Index].SendText(texto[1] + ' entrou na sala: '); => Vai enviando mensagens para todas as conexões da primeira até a ultima, informando quem entrou no servidor.

Else => Se não for 'NICK' o que vem antes do separador '::::', então deve ser mensagem.

WITH S_Server.Socket DO BEGIN => Denovo WITH.

FOR Index := 0 TO ActiveConnections-1 DO BEGIN => Laço de 0 até o final das conexões.

Connections[Index].SendText('(' + texto[1] + ') escreveu: ' + texto[0]); => Envia para todas as conexões a mensagem enviada.

Status.Lines.Add('Servidor ::> ' + texto[1] + ' (' + Socket.RemoteAddress + ') escreveu: '+ texto[0]); => Adiciona no status do servidor uma cópia da mensagem.

Pronto agora terminamos de programar os eventos do componente S_Server. Agora vamos editar suas propriedades no Object Inspector da mesma forma que configuramos o S_Client.

Deixamos Active = False
e Port = 666 (Ou a porta que você usou no S_Client).

e os eventos (Events)

OnClientConnect = S_ServerClientConnect
OnClientDisconnect = S_ServerClientDisconnect
OnClientRead = S_ServerClientRead
OnListen = S_ServerListen

O resto dos eventos ficam em branco como na imagem abaixo:

TESTANDO O CHAT

Pronto salve tudo e compile, agora vá na pasta em que o programa foi compilado e abra 3 janelas do programa.

No primeiro coloque o apelido como Administrador e clique em iniciar o Servidor.
No segundo coloque como usuario1 digite o endereço local (127.0.0.1) e clique em conectar.
No Terceiro coloque como usuario2 digite o endereço local (127.0.0.1) e clique em conectar.

Pronto agora teste a comunicação entre os 3.

Bom espero que tenha funcionado seu CHAT, você pode baixar o código fonte completo do chat e a versão binária do mesmo neste link abaixo:

http://reiserfs.killermonkeys.net/Thiago/Delphi/xhat/c_h_a_t_f_a_l.zip

(O nome do arquivo esta separado por _ para evitar de ser bloqueado pelo Proxy da rede da FAL.)

Links de referência usados:
http://www.guiadodelphi.com.br
http://www.delphi-forum.de

Este tutorial pode ser reproduzido e publicado livremente, desde que se mantenha os créditos do autor.
12 de Março de 2005.
Thiago Melo
(thiago@dolphinconsult.com.br).


118 Responses to “Criando um Chat no DELPHI utilizando Sockets”

  1. Por: Dener Windows XP Internet Explorer 7.0 on set 4, 2007 | Reply

    Ola gostaria se tem como implementar isso p/ ser usado na web ou so funciona local?
    grato

  2. Por: Thiago Melo Windows XP Firefox 2.0.0.6 on set 4, 2007 | Reply

    Sim da para implementar para web, já que é uma conexão TCP/IP, basta apenas conectar no seu IP real da internet.

    Caso esteja usando internet compartilhada, firewall, e etc tem que configurar estes equipamentos ou programas antes.

  3. Por: Marcos Windows XP Internet Explorer 6.0 on set 10, 2007 | Reply

    Amigo Thiago, não li o o artigo todo mas fica fácil implementar o Chat onde eu consiga conversar com um usuário por vez assim como o MSN?

  4. Por: Thiago Melo Windows XP Firefox 2.0.0.6 on set 11, 2007 | Reply

    O chat é bastante amador, mas nele da pra conversar com uma ou várias pessoas ao mesmo tempo, ele só não tem um bom controle de quem esta conectado, mas funciona.

    basta rodar o chat em 2 maquinas diferentes rodar o server em uma e conectar com a outra (lembre-se de configurar seu firewall)

  5. Por: jobim Windows XP Internet Explorer 7.0 on out 6, 2007 | Reply

    Thiago Melo, fiz tudo certo aqui, mas deu um erro!!

    "asynchronous socket error 10049"

    SE VC PUDESSE AJUDAR...

    DEIS DE JA AGRADECIDO

  6. Por: Thiago Melo Windows XP Firefox 2.0.0.7 on out 11, 2007 | Reply

    Isso acontece quando o programa tenta escutar um IP:PORTA e o mesmo já está sendo utilizado.

    Segundo o manual da M$ do winsock

    WSAEADDRNOTAVAIL
    10049

    Cannot assign requested address.

    The requested address is not valid in its context. This normally results from an attempt to bind to an address that is not valid for the local computer. This can also result from connect, sendto, WSAConnect, WSAJoinLeaf, or WSASendTo when the remote address or port is not valid for a remote computer (for example, address or port 0).

  7. Por: Gabriel Windows XP Firefox 2.0.0.8 on nov 4, 2007 | Reply

    Cara... show seu artigo... adorei
    estava querendo fazer um simples joguinho em rede...
    seu artigo me deu um bom começo de como fazer
    vlw... PARABÉNS

  8. Por: Jhony Windows XP Internet Explorer 7.0 on nov 5, 2007 | Reply

    Ohh tiago me dá uma força...
    toda hr dá esse erro e naum tem como fazer mais nada:

    Could not find source location to add methot C_TextoChange."END" or INITIALIZATION not found in unit souce.

    desde já agradeço

  9. Por: Thiago Melo Windows XP Firefox 2.0.0.9 on nov 7, 2007 | Reply

    @Gabriel, valeu velho boa sorte no jogo.

    @Jhony esse erro deu com o source do chat? estranho isso me confirma ai, que eu estou meio esquecido de Delphi, faz anos que não programo em Delphi.

  10. Por: marcos Windows XP Internet Explorer 7.0 on nov 10, 2007 | Reply

    ae thiago, vc tem msn para conversarmos? eu queria saber como posso colorir os nicks?

  11. Por: Francisco Windows XP Internet Explorer 6.0 on nov 18, 2007 | Reply

    Parabéns Thiago

    Artigo muito bom...

  12. Por: Thiago Melo Windows XP Firefox 2.0.0.9 on nov 20, 2007 | Reply

    @marcos tenho gtalk, thiago@oxente.org

  13. Por: João Windows XP Internet Explorer 6.0 on dez 15, 2007 | Reply

    Show de bola

  14. Por: Reinaldo Reis Windows Vista Internet Explorer 7.0 on jan 18, 2008 | Reply

    cara muito show... o que eu aprendi, foi sem valor! muito obrigado. valeu mesmo!!!!!!!!!!!!

  15. Por: Alex Sandro Windows XP Internet Explorer 6.0 on mar 28, 2008 | Reply

    Ola é possivel colocar este Chat no meu site. se for como.

  16. Por: Thiago Melo Windows XP Firefox 2.0.0.13 on abr 2, 2008 | Reply

    Pra site é mais complicado converter, programação WEB e bem mais fácil que essa aí, existem muitos chats prontos e de graça na web basta procurar.

  17. Por: Gabriela Nunes Windows XP Internet Explorer 6.0 on abr 4, 2008 | Reply

    Olá, gostei muito do artigo, porém, ao tentar testar o programa, houve o seguinte erro, já citado anteriormente: "Ashynchrous spcket error 10049", e não sei como arrumá-lo...se pudesse me ajudar, ficaria muito feliz, obrigada pela atenção!!

  18. Por: Thiago Melo Windows XP Firefox 2.0.0.13 on abr 8, 2008 | Reply

    "Ashynchrous spcket error 10049" Olá Gabriela, eu já comentei sobre esse erro aqui, tipo ele da quando a porta e o ip já estão utilizados.

    Pode ser o programa travou a porta, não sei se o código fonte do chat esta no arquivo que eu botei o link mas qualquer coisa eu mando para voce.

    Faz tempo que nao mexo com delphi, então nao me lembro de muita coisa.

  19. Por: André Windows XP Internet Explorer 7.0 on mai 8, 2008 | Reply

    olá... parabéns pelo chat..
    mas é o seguinte:
    aqui ta dando um erro Ashynchrous socket error 10061, oq será q é isto?
    vlw

  20. Por: André Windows XP Internet Explorer 7.0 on mai 8, 2008 | Reply

    ops...
    desculpa, entendi o porque q dava este erro
    só faltava alguem estar como servidor... rsrsrs
    mas vlw, parabéns pelo chat..
    flw

  21. Por: André Windows XP Internet Explorer 7.0 on mai 12, 2008 | Reply

    como posso fazer para que este chat possa ter a função de enviar arquivos, assim o servidor pode mandar um arquivo p/ o cliente, e visse e versa?

  22. Por: Thiago Melo Windows XP Firefox 2.0.0.14 on mai 14, 2008 | Reply

    @Andre, cara eu ainda não estudei essa parte de envio de arquivos em Delphi eu tava vendo isso em C++, porem eu apanhei muito pra fazer o chat e acabei colocando de lado um pouco.
    Reinventar a roda é bom para aprender mas se for pra algo sério e bom da uma olhada em algo pronto, algum plugin e etc.

  23. Por: Eric Windows XP Unknow on mai 31, 2008 | Reply

    Thiago, muito interativo seu post!
    é possível interagir com um chat na web "que ja esteje rodando"?
    a partir de um cliente socket, tipo passando dados/recebendo e montando o chat dentro do delphi?
    abraços!

  24. Por: Luciano Windows XP Firefox 2.0.0.14 on jun 2, 2008 | Reply

    Thiago,

    Muito bom o tópico. Eu gostaria de saber se acaso o lado client da aplicação sair abruptamente o que acontece? Será avisado? Caso não tem com ser feito uma rotina para exibir quem se desconectou abruptamente inclusive com número da conexão. Pelos testes que fiz aqui, qdo um cliente se disconecta de maneira normal é avisado ao server.

  25. Por: Thiago Melo Windows XP Firefox 2.0.0.14 on jun 3, 2008 | Reply

    De maneira brusca ele não avisa mesmo, quando eu fiz esse chat não cheguei a ir a fundo no protocolo, coisas como enviar mensagem privada, ou arquivo não seriam possíveis ate que eu soubesse como controlar os clientes no servidor.
    A partir do momento que eu consiga controlar as conexões com algum tipo de identificação no servidor eu posso avisar quando alguem sai de meneira brusca.

  26. Por: Thiago Melo Windows XP Firefox 2.0.0.14 on jun 3, 2008 | Reply

    @Eric, eu creio que seja possivel sim, porem eu acho que é mais facil e pratico fazer um somente com os recursos da web, como PHP e AJAX, eu tenho um rodando no meu forum como uma shoutbox, sem refresh.
    http://killermonkeys.net (ver o bloco da esquerda)

  27. Por: anonimo Windows XP Firefox 2.0.0.14 on jun 16, 2008 | Reply

    filé do brasil
    muito bom cara continue assim

  28. Por: Rock2099 Windows XP Firefox 3.0 on jun 30, 2008 | Reply

    Muito boa dica de chat, e forum bem interativo, nota 11.

  29. Por: LUANA PADILHA Windows XP Internet Explorer 6.0 on jul 4, 2008 | Reply

    THIAGO eu estou no inicio de aprendizagem de delphi só que tenho que apresentar um trabalho pra feira tecnica e gostei mto do seu chat
    Antes de iniciar o desenvolvimento gostaria de saber sua opiniao se é mto complicado pra uma pessoa iniciante como eu!!??

    sera q consigo??

    ah e }Parabéns..!!

  30. Por: Thiago Melo Windows XP Firefox 3.0 on jul 4, 2008 | Reply

    @Luana,
    Delphi em si é fácil, eu hoje não sei mais nada de Delphi depois que paguei a materia meio que apaguei da mente, mas quando fiz o chat eu não sabia NADA de delphi, eu sabia pascal um pouco, foi lendo na internet e aprendendo.
    O chat é bem simples de fazer e entender e o código fácil de se explicar no caso de apresentar.

  31. Por: LUANA PADILHA Windows XP Internet Explorer 6.0 on jul 4, 2008 | Reply

    Hum eu consegui fazer só q ta dando um um erro Ashynchrous socket error 10061!! o que pode ser isso??

  32. Por: LUANA PADILHA Windows XP Internet Explorer 6.0 on jul 5, 2008 | Reply

    thiago tem diferença nesse memo o ultimo que esta como status pro memo de cima que é o quadro??

  33. Por: David Windows XP Internet Explorer 6.0 on jul 14, 2008 | Reply

    Parabéns Thiago!Show seu artigo!
    Encontrei um pequeno problema e quem sabe vc pode dar uma força. Tenho 3 placas de rede instaladas no meu computador e o servidor monitora o ip da placa que não é a que possui conexão com a internet. Vc sabe como eu poderia escolher a interface a ser usada, no caso a que possui conectividade com a internet?

    Abraço

  34. Por: Thiago Melo Windows XP Firefox 3.0 on jul 16, 2008 | Reply

    @LUANA, nossa nem vi que tinha novo comentário.
    O Ashynchrous socket error 10061 é por que ele não encontrou o servidor, logo acima tem alguem com o mesmo problema e resolveu ligando o server. E não os Tmemo são iguais eu so colori mais o outro.

    @DAVID, não sei como que ele escolhe a Ethernet, achei que ele ficasse escutando no 0/0 (toda a rede) veja se a interface da internet não esta com um firewall, ou você pode colocar o IP da placa que você deseja no S_Server.Host que ele vai dar bind nessa placa exclusivamente.

  35. Por: Gustavo Martins Windows XP Internet Explorer 7.0 on ago 3, 2008 | Reply

    Não sei se o assunto já morreu, mas gostaria de dar a minha contribuição. Sobre o Erro: "Ashynchrous socket error 10061" Falha de conecção com Servidor, resolvi da seguinte maneira:

    No evento OnError do TClientSocket setar o parametro manipulador de erro ErrorCode:= 0; p/ anular a visualização da messagem de erro e evitar a iniciação do ESocketError.

    No evento OnErro tb traz dois parametros p/ identificar a natureza do erro, e assim poder trata-las adequadamente, são elas:

    var ErroCode do tipo Integer
    e
    ErrorEvent do tipo TErrorEvent

    [Capturar Número do Erro] Declarar uma variável do tipo Integer p/ capturar o número do erro:

    num_erro:= ErroCode; // captura o número do erro
    ErroCode:= 0; // Anula manipulador de erro
    Memo1.Lines.Add('Erro: ' + IntToStr(num_erro)); //visualiza o número do erro em TMemo

    [Natureza do Erro]

    Verificado o que provocou o erro, capturando resultado do parametro ErrorEvent: TErrorEvent;

    // soquete eeGeneral recebeu uma mensagem de erro que não se encaixa em qualquer uma das seguintes categorias
    if ErrorEvent = eeGeneral then memo1.Lines.Add('Erro número: ' + IntToStr(num_erro) + ' eeDisconnect');

    //eeSend Ocorreu um erro ao tentar escrever para o soquete de conexão
    if ErrorEvent = eeSend then memo1.Lines.Add('Erro número: ' + IntToStr(num_erro) + ' eeSend');

    //eeReceive Ocorreu um erro ao tentar ler a partir da conexão socket
    if ErrorEvent = eeReceive then memo1.Lines.Add('Erro número: ' + IntToStr(num_erro) + ' eeReceive');

    //Uma ligação eeConnect pedido que foi já aceito não pôde ser concluída
    if ErrorEvent = eeConnect then memo1.Lines.Add('Erro número: ' + IntToStr(num_erro) + ' eeConnect');

    //eeDisconnect Ocorreu um erro ao tentar fechar uma conexão
    if ErrorEvent = eeDisconnect then memo1.Lines.Add('Erro número: ' + IntToStr(num_erro) + ' eeDisconnect');

    //eeAccept Um problema ocorreu durante a tentativa de aceitar solicitação de uma conexão cliente.
    if ErrorEvent = eeAccept then memo1.Lines.Add('Erro número: ' + IntToStr(num_erro) + ' eeAccept');

    Espero ter a ajudado.

    Abraços a todos

    Gustavo Martins

  36. Por: Thiago Melo Windows XP Firefox 3.0.1 on ago 4, 2008 | Reply

    Valeu gustavo.

  37. Por: Lucas Oliveira Windows XP Firefox 3.0.1 on ago 5, 2008 | Reply

    Eu estaria interessado em ter uma ajuda para um jogo de cartas, estilo super trunfo.

    o básico do jogo tem como principio básico um chat parecido com o seu.

    é uma estrutura cliente/servidor

    depois que 4 pessoas entrarem no chat, todas apertarem um botão com status pronto (SIM, NÃO) e o jogo inicia quando todos tem status SIM.

    o servidor embaralha as cartas, distribui todas as cartas.. então o primeiro jogador escolhe um dos atributos, que é comparado com todos os outros jogadores e o maior leva todas as cartas que são colocadas no fim do baralho.

    o jogo termina quando o vencedor obter todas as cartas.

    quero sua opinião sobre isso, pois vou precisar de ajuda. e nao sei aonde procurar materiais para mim ter uma base.

    até mesmo o codigo fonte de um chat simples como o seu ajudaria muito.

    o link está quebrado.

    se puder me ajudar, escreve pra hiro@mundoavatar.com.br

  38. Por: Thiago Melo Windows XP Firefox 3.0.1 on ago 5, 2008 | Reply

    Olá Lucas, sobre o seu projeto com relação a Delphi eu não sei se posso te ajudar pois faz anos luz que não mexo com Delphi, mas o link do chat eu arrumei estava com um domínio antigo e agora já está ok.

  39. Por: Lucas Oliveira Windows XP Firefox 3.0.1 on ago 6, 2008 | Reply

    nao consigo baixar.
    :(

    ja removi todos os underlines
    mas ainda dá como pagina nao encontrada.

  40. Por: Thiago Melo Windows XP Firefox 3.0.1 on ago 7, 2008 | Reply

    Cara não e pra remover os underlines e so clicar

    http://reiserfs.killermonkeys.net/Thiago/Delphi/xhat/c_h_a_t_f_a_l.zip

  41. Por: claudionor Windows XP Internet Explorer 7.0 on set 2, 2008 | Reply

    Cara, preciso apresentar um trabalho na faculdade, onde tenho que criar um chat criptografado. Tem como me dar essa dica.

    Valeu mesmo.

  42. Por: Thiago Melo Windows XP Firefox 3.0.1 on set 5, 2008 | Reply

    Claudionor, cara nunca tive experiência com isso, mas procura ler sobre OpenSSl.

  43. Por: Junior Windows XP Internet Explorer 7.0 on out 14, 2008 | Reply

    Onde posso achar esse componente Tclientsocket

  44. Por: Thiago Melo Windows XP Firefox 3.0.3 on out 15, 2008 | Reply

    Rapaz veio no Delphi que usei acho que Delphi 7

  45. Por: Diógenes Windows XP Firefox 3.0.3 on out 23, 2008 | Reply

    @Junior

    dei uma estudada, tenho um projeto de chat pra fazer e achei esse interessante, ainda to aprendendo

    a TClientSocket e TServerSocket pelo que lí, vem na versão do Delphi 6, no 7 não tem

    porém se vc procurar no diretório do delphi 7 tem um arquivo binário que instala esses 2 componentes

    só n lembro o nome dele, da uma pesquisada no google, q na versão do 7 tem como add eles sim

  46. Por: Danilo Windows XP Firefox 2.0.0.17 on nov 1, 2008 | Reply

    Ola,pessoal quando eu teclo enter a menssagem nao é enviada,alguem poderia me ajuda?

  47. Por: Thiago Melo Windows XP Firefox 3.0.3 on nov 6, 2008 | Reply

    @Danilo, da uma olhada no evento do enter. Não lembro qual é

  48. Por: Francisco César Windows XP Internet Explorer 7.0 on nov 8, 2008 | Reply

    Ao ver esse chat tive a idéia de incorporá-lo num joguinho da forca via rede que estou desenvolvendo. O problema é que não tenho experiência em sockets. Se alguém quiser me ajudar com isso, estou disponibilizando o jogo no link http://www.franciscocesar.com/jogo.forca.v1.zip. O chat do Thiago funciona sem problemas, mas a aplicação da forca só funciona de
    maneira isolada em cada micro; isso é óbvio pq ainda não implementei nada por falta
    de experiência, como já disse. Um abraço a todos, especialmente ao Thiago pelo compartilhamento de seu programa.

  49. Por: Francisco César Windows XP Internet Explorer 7.0 on nov 8, 2008 | Reply

    Esqueci um detalhe...Imagino que o jogo que postei acima poderia funcionar da seguinte forma: Como a interação entre os 2 jogadores não se dá o tempo todo, ou seja, hora joga um, hora jogo outro; em outras palavras, enqto 1 joga (tenta adivinhar a palavra), o outro assiste até acabar o jogo, diferente de uma disputa em tempo real, por exemplo, o que seria mto mais complicado em termos de socket. Então pensei que deve existir algum recurso tipo, o que aparecer aqui (micro 1), mostre lá no outro (micro 2), algo assim. Espero ter sido claro. Abraços...chico

  50. Por: Thiago Melo Windows XP Firefox 3.0.3 on nov 10, 2008 | Reply

    @Francisco a ideia e boa, eu mesmo queria tentar botar mais controle no chat, porem meu conhecimento em sockets de delphi era bem limitados, hoje é nulo hahaah lembro de nada. Boa sorte ai.

  51. Por: Francisco César Windows XP Internet Explorer 7.0 on nov 13, 2008 | Reply

    Valeu Thiago. Acertei diversos bugs que tinha o anterior jogo; caso queira, acesse http://www.franciscocesar.com/Project1.exe
    Assim que conseguir o funcionamento pela rede, deixo aqui pra quem quiser brincar. Abraço.

  52. Por: Mustang Windows XP Firefox 3.0.3 on nov 18, 2008 | Reply

    Aê,show de bola o chat

    Eu tava querendo aprender fazer um chat pra conectar na uol...olha como exemplo os chat clients do alteradoserevoltados.com

    Tem como vc me dá alguma dica?

    Desde já,agradeço

  53. Por: Mustang Windows XP Firefox 3.0.3 on nov 18, 2008 | Reply

    Eu tinha esquecido..Não quero atrapalhar o chat da Uol.

    Tenho a simples ideia de criar um bot q responde perguntas..tipo um joguinho de perguntas e respostas...

    Vlw

  54. Por: Diógenes Windows XP Firefox 3.0.4 on nov 22, 2008 | Reply

    Pô, eu fiz várias modificações nesse chat, tais como skins e funções a mais..porém agora preciso criar, tipo um evento para que quando alguém receber alguma mensagem, tipo acontecesse igual msn, pro cara ver que recebeu uma mensagem e tal..caso alguém queira ver como minhas modificações estão, mail me dgs_alves@live.com!

    agradeço qualquer ajuda desde já!

  55. Por: ERROR Windows XP Internet Explorer 7.0 on jan 7, 2009 | Reply

    Deu erro Aki Meu Velho

  56. Por: Thiago Melo Windows XP Firefox 3.0.5 on jan 8, 2009 | Reply

    Se você ler os comentários acima vai ver que outras pessoas conseguiram, e outras tiveram problemas, basta pesquisar um pouco no google para resolver o problema na compilação no seu PC. Cada PC é diferente, versões, drivers, compiladores e etc, claro que o código pode da erro dependendo da versão do Delphi que você usa.

  57. Por: Fábio Mattes Windows XP Firefox 3.0.5 on jan 23, 2009 | Reply

    Teria como eu bloquear um certo cliente sem desconectalo do chat, tipo eu levanto o server de chat e derepente entram 3 clientes, mas um desses clientes está fora das regras do chat, então eu quero bloquealo. Tem como?

  58. Por: Thiago Melo Windows XP Firefox 3.0.5 on jan 26, 2009 | Reply

    Creio que sim porem como eu não implementei e não mostrei ai como controlar as conexões, você vai ter que dar uma fuçada na documentação do componente de socket pra ver como controlar as conexões pelo server.

  59. Por: henrique Windows XP Firefox 3.0.5 on jan 29, 2009 | Reply

    horrivel faz uma video aula melho que isso mano

  60. Por: Thiago Melo Windows XP Firefox 3.0.5 on jan 30, 2009 | Reply

    "Vídeo Aula?", onde você está vendo vídeo aula? Se você não entendeu como se faz melhor estudar delphi um pouco mais "mano" antes de tentar algo.

  61. Por: Leonardo Windows XP Internet Explorer 6.0 on fev 7, 2009 | Reply

    Olé thiago, belo tutorial, simples e rápido, mas é o seguinte eu tenho o delphi 7, só que ele não tem o Botão Tlabel, na aba Internet, o que eu posso fazer?

  62. Por: Leonardo Windows XP Internet Explorer 6.0 on fev 7, 2009 | Reply

    Olá*

  63. Por: Vyttor Salgado Windows XP Google Chrome 1.0.154.36 on fev 9, 2009 | Reply

    Então gente, esse erro que apareceu para um monte gente ai de:

    "asynchronous socket error 10049"

    tanto pode ser a porta que por acaso pode estar em uso como tambem, vcs estarem abrindo o Chat antes que o server....

    Precisamente deve ser aberto o server antes do nosso programa de chat.....

    Gostei do forum gente.... vlw ai... isso ai... apoio mutuo...

  64. Por: Ricardo Windows XP Firefox 3.0.6 on fev 9, 2009 | Reply

    Bem Thiago meu problema é o seguinte estou montando uma aplicação que será limitada para 2 usuarios somente por servidor ... então criei um codigo de recepção em cada mensagem que direciona ela para os campos corretos no programa agora eu não consigo por exemplo mandar a mensagem para apenas um dos participantes ...
    EX: Participante1 enviou: 1[1,2]**[9.0]3%%Bom dia ;
    Eu gostaria que a mensagem chegasse somente no Participante2 ... teria como me ajudar ? sou experiente em delphi mais esse é um problema que eu não consegui resolver ainda =X

    espero respostas =)

  65. Por: Ricardo Windows XP Firefox 3.0.6 on fev 9, 2009 | Reply

    Estou fazendo assim ...
    Declarei essa variavel global :
    conexao :tlist;

    Montei essa função :
    function direcionar(cliente: pointer):integer;
    begin
    result := conexao.IndexOf(cliente);
    End;

    Estou usando-a assim :

    procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
    Socket: TCustomWinSocket);
    Var Msg : String;
    IDCli : integer;
    begin
    IDCli := LocalizaCliente(Socket.Data);
    Msg := socket.ReceiveText;

    If IDCli = 1 then
    Serversocket1.Socket.Connections[2].SendText(msg)
    else
    Serversocket1.Socket.Connections[1].SendText(msg);
    end;

    percebe algum erro? dessa maneira ele não esta enviando pra nem um nem outro =S

    .... aguardo respostas

  66. Por: Ricardo Windows XP Firefox 3.0.6 on fev 9, 2009 | Reply

    desculpe o post acima pq eu desenvolvo duas aplicaçoes ao mesmo tempo então acabei me confundindo ...

    Estou fazendo assim ...
    Declarei essa variavel global :
    conexao :tlist;

    Montei essa função :
    function direcionar(cliente: pointer):integer;
    begin
    result := conexao.IndexOf(cliente);
    End;

    Estou usando-a assim :

    procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
    Socket: TCustomWinSocket);
    Var Msg : String;
    idcliente : integer;
    begin
    idcliente := direcionar(Socket.Data);
    Msg := socket.ReceiveText;

    If IDCli = 1 then
    Serversocket1.Socket.Connections[2].SendText(msg)
    else
    Serversocket1.Socket.Connections[1].SendText(msg);
    end;

    percebe algum erro? dessa maneira ele não esta enviando pra nem um nem outro =S

    .... aguardo respostas

  67. Por: Thiago Melo Windows XP Firefox 3.0.6 on fev 9, 2009 | Reply

    @Leonardo, acho que usei Delhpi 6 não lembro, mas acho que Tlabel e so uma label pode se usar qualquer outra coisa.

    @Vyttor Salgado, sim eu também creio que seja isso.

    @Ricardo, eu citei lá em cima, eu não sou muito bom em Delphi, apenas curioso, gosto muito de TCP/IP, o lance do chat foi apenas ver como funciona, mas a parte de controle, eu procurei bastante por algum material na internet e não achei, acabei deixando só no básico mesmo.
    Quando eu falo controle, falo em controlar o protocolo, a conexão, fazer com que eu possa avisar o servidor se fulando entrou ou saiu da sala, ou enviar uma mensagem privada, fazendo com que o servidor só envie para 1 pessoa.
    Para fazer isso tem que aprender a controlar e identificar as conexões de forma que quando um client mandar o pacote com a informação por exemplo MENSAGEM PRIVADA para CLIENTE Y, ele envie para o socket de client Y.
    No meu código ele não identifica de quem é o socket ele apenas faz um loop com todas as conexões e envia os dados.

  68. Por: Vyttor Salgado Windows XP Google Chrome 1.0.154.36 on fev 9, 2009 | Reply

    Ricardo >>>> Seguinte você tem várias maneiras de fazer isso, mais a que eu aconselho por ser mais simples e fácil seria você criar um identificador na msg que vc envia.... e depois o servidor dispara a msg para todos os cliente, só que você no cliente você configura para ele ouvir somente as msg que estiverem endereçadas a ele... entendeu você cria um identificador de quem ta enviando e para quem é a msg quando for para todo vc simplesmente configura o cliente para aceitar o dele como tambem o de todos...... Depois eu posto um código básico aqui de como você vai fazer isso ok?

  69. Por: Vyttor Salgado Windows XP Google Chrome 1.0.154.36 on fev 9, 2009 | Reply

    Se alguêm tiver duvidas pode perguntar aqui... vou passar a apoiar esse fórum aqui gente... eu gosto muito de programação....

    Isso claro que com a permissão do nosso Amigo Thiago, a própósito muito boa sua lógica ai nesse Tut que você fez.... Meus parabéns...

    Muito bem elaborado mesmo....

  70. Por: Vyttor Salgado Windows XP Google Chrome 1.0.154.36 on fev 9, 2009 | Reply

    Thiago em qual periodo você esta mesmo????

    Me adiciona no msn estou querendo contatos de programadores.... para nos auto ajudar em caso de duvidas....

    Msn: vyttorsalgado@hotmail.com

    Precisando eu estou completamente a dispor....

  71. Por: Thiago Melo Windows XP Firefox 3.0.6 on fev 10, 2009 | Reply

    Opa vytor pode ajudar o povo aqui a vontade, realmente esse artigo meu é muito visitado pela a falta de conteúdo nesse assunto (tcp/ip) na internet. Na época eu penei para achar algo.
    Eu não uso msn, uso gtalk apenas thiago(@)oxente.org, até escrevi algo sobre msn VS gtalk segue o link.
    http://thiago.oxente.org/2007/04/20/google-talk-vs-live-messenger

  72. Por: Vyttor Salgado Windows XP Google Chrome 1.0.154.48 on fev 10, 2009 | Reply

    Opa... Thiago, me passa ai outros forums legais ai... para trocar de informação....

    Eu gostaria algum forum legal sobre frames... Conhece algum?

    Vlw pela ajuda...

  73. Por: Thiago Melo Windows XP Firefox 3.0.6 on fev 11, 2009 | Reply

    Cara de Delphi eu so conheço os que botei la na referencias do artigo, mas fora isso tem a unidev.com.br que é muito bom, porem voltado para jogos.

  74. Por: Vyttor Salgado Windows XP Google Chrome 1.0.154.36 on fev 11, 2009 | Reply

    Não precisa ser de Delphi especificamente.... mais pode ser de C#, visual basic, Cobol, lisp, php, visual c++ enfim, sobre qualquer linguagem..... eu gosto de aprender.....

  75. Por: lightning Windows XP Firefox 3.0.6 on fev 21, 2009 | Reply

    boas thiago
    eu gostei muito do seu posto, porem a testar os caracteres que aparecem na memo em vez de ser o texto aparecem so quadredos, mudei o tipo de letra e começaram a aparecer aqueles caracteres chineses...
    tens ideia do que isto possa ser ?
    obrigado e parabens pelo post

  76. Por: lightning Windows XP Firefox 3.0.6 on fev 21, 2009 | Reply

    P.S.: é so o texto que é dinamico ou seja recebido por exemplo, apelidos...
    por exemplo texto_enviado+' disse:'
    so o texto enviado e que aparece com caracteres estranhos, o que ja estava pre-defenifo/"estatico" definido mesmo no codigo aparece bem :S

  77. Por: Thiago Melo Windows XP Firefox 3.0.6 on fev 26, 2009 | Reply

    @lighting, tenta primeiro voltar o tipo de letra para o padrão, se funcionar então o problema está ai, nesse caso você vai ter que da uma pesquisa na net sobre isso de trocar o tipo de letra pois eu confesso que estou por fora total :) .

  78. Por: Khayo Windows XP Google Chrome 1.0.154.48 on mar 20, 2009 | Reply

    Muito bom o tutorial, para falar a verdade eu vi este tutorial numa outra página e difícil de entender, e depois que fiz todo o tutorial encontrei a sua pagina... hehehe. Estou com problemas para roda-lo, mas pelos comentários não fui o único e pela explicação que você deu anteriormente o problema é na máquina ("asynchronous socket error 10049"),

  79. Por: Thiago Melo Windows XP Firefox 3.0.7 on mar 23, 2009 | Reply

    Então cara esse problema 10049 e com relação a porta, veja se você está rodando o server antes de conectar, e também veja se a porta já esta sendo utilizada.

  80. Por: Karina Windows XP Firefox 3.0.8 on abr 1, 2009 | Reply

    Thiago como conecto na rede, tenho um computador com Windows XP e outro com o Vista, eles estão em rede, mas não consigo enviar mensagens entre eles.
    A rede esta funcionando normal, o programa esta no Xp, então puxei um atalho para o Vista. Conecto o servidor no XP,e no Vista quando clico em conectar da um erro de soket...
    O que devo colocar no campo servidor do computador cliente(Vista)?

    Grata desde já, gostei muito da sua dica, mas vc pode resolver meu problema?

  81. Por: Karina Windows XP Firefox 3.0.8 on abr 2, 2009 | Reply

    O erro quando tento conectar o cliente é:
    Erro 10061 de sincronia do socket...

    Aguardo respota... obrigada

  82. Por: Thiago Melo Windows XP Firefox 3.0.8 on abr 3, 2009 | Reply

    @Karina, você tem que pegar os IP das duas maquinas antes, e na maquina cliente o Vista você deve colocar o ip do XP no campo servidor, para informar para ele onde você vai conectar.

    No caso o vista está conectando no XP
    VISTA -> XP, qualquer coisa me add no gtalk/gmail thiago(a)oxente.org

  83. Por: Karina Windows XP Firefox 3.0.8 on abr 3, 2009 | Reply

    O Vista esta conectado ao XP (O XP é o servidor)... fiz o que vc mandou, fiz ate um programinha para pegar todos os Ip's da rede para facilitar...
    Conecto o XP como sevidor e no Vista coloco o IP do XP que é (192.168.0.1) conecto e...
    Não conectou agora da o erro 10060...
    Obrigada mesmo assim, vou instalar o Gtalk para entrar em contato com vc.

    Obrigada :)
    Karina
    Juazeiro-Bahia

  84. Por: roger Windows XP Firefox 3.0.8 on abr 12, 2009 | Reply

    Legal...

    Acho que seria bom colocar um pequeno controle de erros para caso alguém tente mandar uma mensagem "NICK" .. rsrssr

    vlw pelo exemplo :D

  85. Por: Thiago Melo Windows XP Firefox 3.0.8 on abr 14, 2009 | Reply

    Fico no aguardo Karina.
    @Roger, um controle melhor das conexões seria ótimo, mas tem que estudar mais a fundo os componentes coisa que eu não fiz hehehe.

  86. Por: lightning Windows Vista Firefox 3.0.8 on abr 15, 2009 | Reply

    boas thiago
    desculpe a ausencia..
    ja tentei varias coisas e nao estou a conseguir, aparece sempre caracters chineses.
    será que é algum defeito dos sockets ?
    onde posso sacar novos sockets (cliente/server) para o delphi ?

    grato

  87. Por: lightning Windows Vista Firefox 3.0.8 on abr 15, 2009 | Reply

    bem, e que tambem nao sao todas as letras, sao so algumas que aparecem com caracters chineses, outras aparecem bem ..

    bem, tu tens msn onde possamos falar , talvez te possa enviar o meu chat ou coisa assim para veres, ou tu poças enviar-me o teu para ver se o teu da bem ?

  88. Por: Thiago Melo Windows XP Firefox 3.0.8 on abr 16, 2009 | Reply

    @lighting eu nao uso msn, so tenho gtalk/gmail me add ai, thiago(a)oxente.org

    com certeza e algo errado no seu delphi.

  89. Por: wesley Windows XP Opera 9.64 on mai 9, 2009 | Reply

    thiago Seu post é muito bom mesmo...
    kra eu fiz esse chat do jeito serto e deu um erro quando tentei connectar o pc do meu pai nesse chat(Para testar) obs: o pc dele é na msm REEDE-LAN.

    Acima pessoas perguntarao sobre o mesmo erro, e vc dice que tem que comfiguar fireware, diga mais sobre isso, o que devemos comfigurar no fire ware. o meu chat coloquei a porta 9092 e tentei configuralo tbm com outros tipos de ip(exemplo: no-ip e hamachi) sempre ocorre o mesmo erro.

  90. Por: Thiago Melo Windows XP Firefox 3.0.10 on mai 11, 2009 | Reply

    Nas configurações da conexão do windows, se você clicar com o botão direito no icone de conexão perto la do relogio, vai aparecer configurações de FIREWALL, desligue o firewall e tente novamente.

    OBS meu windows é XP, no Vista não faço ideia.

  91. Por: Alex Eloy Windows XP Firefox 3.0.10 on mai 20, 2009 | Reply

    Caros...

    é o seguinte....

    como faço para resolver o seguinte problema:

    do jeito que estar ai... se no servidor eu
    colocar isso:

    por exemplo:

    S_Server.Socket.ActiveConections

    ele vai retornar a quantidade de clientes conectados à ele... mas.... se num dos clientes eu desconectar do servidor....... sem ser por meio do botão 'Desconectar' (por exemplo: desconectando o cabo de rede), o servidor vai ficar identificando que o socket desse cliente ainda está ativo..... como faço pra resolver esse problema...

    fico no aguardo....
    retornem a resposta para o meu email.:

    contato@alexeloy.com

  92. Por: Juliana Windows XP Internet Explorer 7.0 on mai 25, 2009 | Reply

    Olá Thiago.
    Estou no 2º ano de ensino técnico, e como trabalho final preciso fazer um chat, conectando dois computadores.
    Após algumas procuras, achei seu site e me interessei.
    O problemas é que eu preciso utlizar o programa C#, junto com o MYSQL. Gostaria de saber se vc tem alguma informação sobre isso :D

    Obrigada!

  93. Por: Thiago Melo Windows XP Firefox 3.0.10 on mai 26, 2009 | Reply

    @Juliana eu fiz alguma coisa com C++ e Linux, já usei tambem o Visual C++ com SQLlite e apanhei pra caramba creio que com o MySQL seja mais facil.

    Não tenho muito conhecimento com C# e .NET, eu tinha baixado o visual studio mais novo aqui mas não tive tempo para testar, infelizmente meu conhecimento em C# é nulo, e não tenho nenhum conteudo.

    Mas para fazer um chat você deve primeiro esquecer o MySQL e aprender o basico de conexões usando C#, usar sockets e etc, abrir um socket e conectar nele usando C++ por exeplo é super facil. Manipular essa conexão é outra coisa que requer um bom estudo, o ruim e que conteudo sobre isso na internet é muito fraco, o povo se concentra d+ em Delphi e Java.

    Mas boa sorte no trabalho se tiver alguma duvida especifica pode entrar em contato, meu gtalk é thiago(arroba)oxente.org, não uso MSN.

  94. Por: Thiago Melo Windows XP Firefox 3.0.10 on mai 28, 2009 | Reply

    Isso eu não sei na época até procurei um meio de fazer isso, mas o maior problema e identificar e controlar as conexões, primeiro tem que saber como dominar cada conexão, identificar, e setar um controle do tipo ficar dando um ping na conexão, enviando um teste, para poder dar um timeout.

  95. Por: Juliana Windows XP Internet Explorer 7.0 on jun 3, 2009 | Reply

    ah sim, obrigado do mesmo jeito Thiago! Falei com a minha professora e ela disse que teria que usar uma CLASSE com SERVIDOR/CLIENTE para assim adicionar o IP e haver a conexão. Você saberia algo sobre isso ? agradeço desde já!

  96. Por: Thiago Melo Windows XP Firefox 3.0.10 on jun 3, 2009 | Reply

    Vish Juliana ai ta fora do meu conhecimento, mas eu achei um bom link ta em portugues de Portugal, mas e melhor que nada, da uma olhda
    http://wiki.portugal-a-programar.org/cs:chat_usando_sockets_e_threads

  97. Por: Juliana Windows XP Internet Explorer 7.0 on jun 10, 2009 | Reply

    Olá Tiago preciso fazer um chat Delphi usando porta serial, tem alguma dica agradeço desde já bjus

  98. Por: Thiago Melo Windows XP Firefox 3.0.10 on jun 12, 2009 | Reply

    Juliana, não entendi usando porta serial, você vai ligar dois computadores pela aquela porta serial? Eu nunca tive experiencia com isso faço nem idéia, mas creio que se você abrir o dispositivo e enviar uma mensagem ela chega do outro lado, pois no Linux se você der um echo "mensagem" > /dev/dispositivoserial a mensagem é enviada.

  99. Por: Juliana Munhoz Windows XP Firefox 2.0.0.20 on jun 13, 2009 | Reply

    Ah sim, obg pelo site Thiago.. está ajudando muito!

    abraços

  100. Por: carlos Windows XP Internet Explorer 7.0 on jun 16, 2009 | Reply

    Para instalar o socket no delphi 7 seguir:
    Component | Install Packages | Add .../bin/dclsockets70.bpl

  101. Por: Adriano Windows XP Internet Explorer 7.0 on jul 2, 2009 | Reply

    Galera eu estou criando um chat pessoal para usar entre os usuário de uma rede interna... qdo pesquisei achei esse post ... é muito bom mesmo ... no meu chat estou usando tlistview pra mostrar colunas com ip /nome maquina / status ... tá muito legal mesmo ... T+ Galera !!!

  102. Por: Thiago Melo Linux Firefox 3.0.11 on jul 7, 2009 | Reply

    Interessante Adriano, fica ai mais uma dica para quem quiser aprofundar e controlar as conexões.

  103. Por: matheus Windows XP Firefox 3.0.11 on jul 11, 2009 | Reply

    Que delphi e utilizado neste chat
    foi inserido no dia 16 agosto, 2006
    entao presumi que fosse o delphi 2005
    mas no delphi 2005 nao tem TclientSocket TserverSocket

  104. Por: Rodrigo Windows XP Internet Explorer 7.0 on jul 11, 2009 | Reply

    Muito bom

    me ajudou bastante

  105. Por: Thiago Melo Windows XP Firefox 3.0.11 on jul 12, 2009 | Reply

    Matheus eu acho que foi Delphi6 ou Delphi7 não lembro pois eu usava ambos na epoca.

  106. Por: ang Windows XP Firefox 3.5.3 on set 25, 2009 | Reply

    Cara dau tudo certo mas quando eu envio uma mensagem vai pro servidor como [][][][] ( caixinhas)

    obs: uso delphi 2009 com os componentes instalados

  107. Por: Thiago Melo Linux Firefox 3.5.3 on set 28, 2009 | Reply

    ang, Eu creio que seja um problema de codificação, teve uma pessoa que reportou as fontes estarem saindo em chinês no lado do servidor, e estava usando delphi 2009 também. Só não sei como ela resolveu, pois esse treco ai eu fiz no delphi6 ou 7 não lembro, e faz muuuuito tempo.

  108. Por: Caio Windows XP Internet Explorer 8.0 on set 30, 2009 | Reply

    Opa, parabéns pelo ótimo post!

    Tô desenvolvendo um chat meu a partir do seu e tô tentando colocar a opção do usuário poder mudar a cor do texto que digitar. Coloquei um FontDialog para modificar o que escrever no Edit de envio e ele muda tranquilo, mas o ServerSocket.SendText não armazena a cor, aparentemente, apenas o texto. Como eu poderia fazer?

  109. Por: Thiago Melo Windows other version Firefox 3.5.3 on out 2, 2009 | Reply

    voce poderia editar a parte que ele envia o pacote (Mensagem::::Apelido) e mudar para (Mensagem::::Apelido:::COR)

    Agora tem que pegar a string do codigo da cor.

  110. Por: Alexsander Windows XP Firefox 3.5.3 on out 10, 2009 | Reply

    Thigo quando tento executar o seu codigo em casa ele mostra um erro na parte do S_cliente e do S_Server, diz q nao foi declarado algo assim. como posso concertar? pq to querendo implementar seu codigo.
    vlws

  111. Por: Alexsander Windows XP Firefox 3.5.3 on out 10, 2009 | Reply

    axei o erro..é q nao ta aparecendo o S_Cliete e o S_Server aki..mas quando vou criar um, ja diz q ja esxite com o mesmo nome, nao entendo.

  112. Por: Thiago Windows XP Firefox 3.5.3 on out 19, 2009 | Reply

    Aew cara, grande tutorial...

    eu portei ele pro delphi 2010 aqui, dai rodo o app em duas maquinas diferentes...
    acontece q apenas o primeiro ip que se conecta ao servidor recebe as mensagens... sabe uq pode ser??

    vlw

  113. Por: Thiago Melo Linux Firefox 3.5.3 on out 20, 2009 | Reply

    pode ser o firewall.

  114. Por: Luis Basilio Windows XP Internet Explorer 8.0 on dez 7, 2009 | Reply

    Mto bom,ficou mto show
    mais ele só serve para falar por exemplo com os pcs q estao em rede não é? tem como eu conversar por exemplo com alguem q esta em outro lugar?
    vlw

  115. Por: Thiago Melo Linux Firefox 3.5.5 on dez 9, 2009 | Reply

    serve para internet também, basta ter o IP das maquinas e firewall desligado (ou propriamente configurado).

  116. Por: michael Windows XP Firefox 3.5.5 on dez 22, 2009 | Reply

    ei onde eu compro o
    TclientSocket
    TserverSocket

    ??

  117. Por: Thiago Melo Windows XP Firefox 3.5.6 on dez 23, 2009 | Reply

    no Delphi que usei 6 ou 7 (não lembro) já vinha.

  118. Por: Bruno N. Windows XP Internet Explorer 8.0 on jan 4, 2010 | Reply

    Parabéns pelo artigo...
    Ajudando o amigo acima...Fiz o exemplo no Delphi 2007, para usar TclientSocket e o TserverSocket e necessário instalar o componente “dclsockets100.bpl” que esta na pasta “C:\Arquivos de programas\CodeGear\RAD Studio\5.0\bin”. Abraço

Post a Comment