ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Websocket ouvindo porta
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
edsonalves
Colaborador
Colaborador


Registrado: Terça-Feira, 27 de Janeiro de 2009
Mensagens: 1938
Localização: Bauru - SP

MensagemEnviada: Qui Mai 25, 2017 8:36 am    Assunto: Websocket ouvindo porta Responder com Citação

Pessoal, bom dia
Como o delphi esta para websockets, tenho um ip e porta que preciso ficar ouvindo e toda vez que ouvir um pedido e esse server vai disparar um aviso para os clients, procurei na net mas não achei nada, alguem ja fez algo nesse sentido? o Server que precisa ficar ouvindo esta em Node.js
_________________
Cria em mim, ó Deus, um coração puro, e renova em mim um espírito reto.
http://twitter.com/edson_alves_
Skype: edson.alvesan
http://www.vacabikers.wordpress.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Yahoo Messenger MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Qui Mai 25, 2017 9:24 am    Assunto: Re: Websocket ouvindo porta Responder com Citação

edsonalves escreveu:
Pessoal, bom dia
Como o delphi esta para websockets, tenho um ip e porta que preciso ficar ouvindo e toda vez que ouvir um pedido e esse server vai disparar um aviso para os clients, procurei na net mas não achei nada, alguem ja fez algo nesse sentido? o Server que precisa ficar ouvindo esta em Node.js


Você já tem o IP e porta, basta saber o que ler e escrever para o servidor, o componente que pode usar seria o IdTCPClient ou IdUPDClient da Indy ou winsock que é uma biblioteca.
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
edsonalves
Colaborador
Colaborador


Registrado: Terça-Feira, 27 de Janeiro de 2009
Mensagens: 1938
Localização: Bauru - SP

MensagemEnviada: Qui Mai 25, 2017 1:02 pm    Assunto: Re: Websocket ouvindo porta Responder com Citação

strak2012 escreveu:
edsonalves escreveu:
Pessoal, bom dia
Como o delphi esta para websockets, tenho um ip e porta que preciso ficar ouvindo e toda vez que ouvir um pedido e esse server vai disparar um aviso para os clients, procurei na net mas não achei nada, alguem ja fez algo nesse sentido? o Server que precisa ficar ouvindo esta em Node.js


Você já tem o IP e porta, basta saber o que ler e escrever para o servidor, o componente que pode usar seria o IdTCPClient ou IdUPDClient da Indy ou winsock que é uma biblioteca.


Strack, blz...

Então cara não vou precisar escrever nada na porta, só ouvir mesmo o que esta na porta... sempre que tiver algo ela vai me enviar esta mensagem:

Código:
messages : {"pedido_id": 111,"id_empresa":5}


Nunca mexi com o indi dessa forma, conheçe algum exemplo?
_________________
Cria em mim, ó Deus, um coração puro, e renova em mim um espírito reto.
http://twitter.com/edson_alves_
Skype: edson.alvesan
http://www.vacabikers.wordpress.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Yahoo Messenger MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Qui Mai 25, 2017 1:29 pm    Assunto: Responder com Citação

podes se basear neste exemplo cá:
Chat_Room_Socket_(Delphi)

O evento responsável por ouvir o servidor se chama "ClientSocket1Read"
nele você terá tudo que o servidor estar a enviar

Este exemplo é do component socket que vem com o delphi (requer a instalação manual, mesmo que ainda seja nativo do delphi)

informações da instalação do component socket do delphi

Installing_Socket_Components

Basicamente as coisas (instalação) muda um pouco de versão para versão do delphi, mas a grosso modo é tudo muito similar

Este exemplo tb é bem similar ao do IdTCPCLient.

lembro também que o IdTCPClient trata socket como um camada inferior assim este componente oferece mais recursos alem do sokect propriamente dito.
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
edsonalves
Colaborador
Colaborador


Registrado: Terça-Feira, 27 de Janeiro de 2009
Mensagens: 1938
Localização: Bauru - SP

MensagemEnviada: Sex Mai 26, 2017 6:38 pm    Assunto: Responder com Citação

strak2012 escreveu:
podes se basear neste exemplo cá:
Chat_Room_Socket_(Delphi)

O evento responsável por ouvir o servidor se chama "ClientSocket1Read"
nele você terá tudo que o servidor estar a enviar

Este exemplo é do component socket que vem com o delphi (requer a instalação manual, mesmo que ainda seja nativo do delphi)

informações da instalação do component socket do delphi

Installing_Socket_Components

Basicamente as coisas (instalação) muda um pouco de versão para versão do delphi, mas a grosso modo é tudo muito similar

Este exemplo tb é bem similar ao do IdTCPCLient.

lembro também que o IdTCPClient trata socket como um camada inferior assim este componente oferece mais recursos alem do sokect propriamente dito.


Amigo ta caminhando aqui a coisa...

Conectar na porta já consegui, mas por enquanto ainda não escuto nada...

ai no web o meu esta assim:

Código:
socket.on ('messageSuccess', function (data) {
    reloadPedidosAdmin(data.pedido_id);
});


Ai no socket aqui do delphi preciso ficar ouvindo esse evento:
Citação:
messageSuccess


Ainda apanhando um pouco com isso, se souber como ouço esse evento já me ajuda... Vlw[/quote]
_________________
Cria em mim, ó Deus, um coração puro, e renova em mim um espírito reto.
http://twitter.com/edson_alves_
Skype: edson.alvesan
http://www.vacabikers.wordpress.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Yahoo Messenger MSN Messenger
edsonalves
Colaborador
Colaborador


Registrado: Terça-Feira, 27 de Janeiro de 2009
Mensagens: 1938
Localização: Bauru - SP

MensagemEnviada: Ter Mai 30, 2017 12:01 am    Assunto: Responder com Citação

up
_________________
Cria em mim, ó Deus, um coração puro, e renova em mim um espírito reto.
http://twitter.com/edson_alves_
Skype: edson.alvesan
http://www.vacabikers.wordpress.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Yahoo Messenger MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Ter Mai 30, 2017 8:58 am    Assunto: Responder com Citação

Vejamos então seu caso.
Há pelo menos três hipóteses de como descobrir como estar programado o servidor.

1ª hipótese
Se o servidor estiver programado a periodicamente estar a enviar aos seus cliente uma mensagem "dados", então neste caso o cliente só precisa se conectar a porta e ip apenas e fica a escutar o que vem do servidor nada mais do que isso.

2ª hipótese
Se o servidor estiver programado esperar que o cliente lhe solicite uma resposta, neste caso o cliente precisa saber o que enviar ao servidor para que o mesmo lhe responda adequadamente.

3ª hipótese
Se o servidor estiver programado esperar dados de autenticação vinda do cliente, neste caso o servidor não envia nada aos seus clientes até que o mesmos tenham se autenticados.

podendo haver combinações entre as hipótese tal como:
3ª hipótese + 1ª hipótese
ou
3ª hipótese + 2ª hipótese



O trecho que postou não diz muita coisa:

Código:
socket.on ('messageSuccess', function (data) {
    reloadPedidosAdmin(data.pedido_id);
});



Pelo que me parece é que no socket do servidor quando ocorrem alguma mensagem de "messageSuccess" ele responde com o id do pedido, contudo me parece que o cliente precisa solicitar tal dado enviando-lhe alguma solicitação "mensagem", assim sendo se poder estender um pouco mais o trecho para que possamos avaliar um contexto mais completo código do servidor talvez possamos apontar como fazer esta interação entre os socket do delphi e do websocket.


bom é isso dá uma analisada e depois diz algo.
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
edsonalves
Colaborador
Colaborador


Registrado: Terça-Feira, 27 de Janeiro de 2009
Mensagens: 1938
Localização: Bauru - SP

MensagemEnviada: Ter Mai 30, 2017 3:26 pm    Assunto: Responder com Citação

strak2012 escreveu:
Vejamos então seu caso.
Há pelo menos três hipóteses de como descobrir como estar programado o servidor.

1ª hipótese
Se o servidor estiver programado a periodicamente estar a enviar aos seus cliente uma mensagem "dados", então neste caso o cliente só precisa se conectar a porta e ip apenas e fica a escutar o que vem do servidor nada mais do que isso.

2ª hipótese
Se o servidor estiver programado esperar que o cliente lhe solicite uma resposta, neste caso o cliente precisa saber o que enviar ao servidor para que o mesmo lhe responda adequadamente.

3ª hipótese
Se o servidor estiver programado esperar dados de autenticação vinda do cliente, neste caso o servidor não envia nada aos seus clientes até que o mesmos tenham se autenticados.

podendo haver combinações entre as hipótese tal como:
3ª hipótese + 1ª hipótese
ou
3ª hipótese + 2ª hipótese



O trecho que postou não diz muita coisa:

Código:
socket.on ('messageSuccess', function (data) {
    reloadPedidosAdmin(data.pedido_id);
});



Pelo que me parece é que no socket do servidor quando ocorrem alguma mensagem de "messageSuccess" ele responde com o id do pedido, contudo me parece que o cliente precisa solicitar tal dado enviando-lhe alguma solicitação "mensagem", assim sendo se poder estender um pouco mais o trecho para que possamos avaliar um contexto mais completo código do servidor talvez possamos apontar como fazer esta interação entre os socket do delphi e do websocket.


bom é isso dá uma analisada e depois diz algo.


Amigo, no caso é a 1ª hipótese... entretando existe o evento "messageSuccess" que preciso ouvir este evento...

Por exemplo seu simplesmente se conectar na porta, blz.. mas não acontece nada, mas ai eu preciso ficar observando o evento messageSuccess ai neste evento é que vem o retorno. Apenas não consegui a ouvir este evento...
_________________
Cria em mim, ó Deus, um coração puro, e renova em mim um espírito reto.
http://twitter.com/edson_alves_
Skype: edson.alvesan
http://www.vacabikers.wordpress.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Yahoo Messenger MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Ter Mai 30, 2017 3:41 pm    Assunto: Responder com Citação

Toda vez que o servidor enviar qualquer coisa ao seu clientes é disparado no cliente o evento ClientSocket1Read é onde podes ouvir o que enviou o servidor.


Código:
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var Data : String;
begin
Data := ClientSocket1.socket.ReceiveText; // recebo do servidor qualquer coisa que ele envie e passo para uma string

{trabalho com a tal string (Data) aqui }

memo1.lines.add(Data); // caso queira exibir o que estou ouvindo do servidor num Tmemo.

end;


Se mesmo assim não chega nada ao cliente, possivelmente seu caso não se trata apenas da 1ª hipótese
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
edsonalves
Colaborador
Colaborador


Registrado: Terça-Feira, 27 de Janeiro de 2009
Mensagens: 1938
Localização: Bauru - SP

MensagemEnviada: Ter Mai 30, 2017 7:11 pm    Assunto: Responder com Citação

strak2012 escreveu:
Toda vez que o servidor enviar qualquer coisa ao seu clientes é disparado no cliente o evento ClientSocket1Read é onde podes ouvir o que enviou o servidor.


Código:
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var Data : String;
begin
Data := ClientSocket1.socket.ReceiveText; // recebo do servidor qualquer coisa que ele envie e passo para uma string

{trabalho com a tal string (Data) aqui }

memo1.lines.add(Data); // caso queira exibir o que estou ouvindo do servidor num Tmemo.

end;


Se mesmo assim não chega nada ao cliente, possivelmente seu caso não se trata apenas da 1ª hipótese


Então amigo, faço exatamente dessa forma, mas não existe nenhuma mensagem... Porem o retorno esta no evento: messageSuccess... tem um plugin do chrome chamado Socket.io Tester neste plugin coloco o ip e porta e ele fica ouvindo, mas para funcionar preciso adicionar o evento: messageSucess... vou colocar um print pra vc ver...

Observe o campo sublinhado de laranja é o evento que preciso ouvir se eu não colocar nada ali, fica igual fica no delphi, sem ouvir nada, mas quando coloco o messageSuccess e tem algum pedido no servidor ele retorna este objeto que esta ao lado...


_________________
Cria em mim, ó Deus, um coração puro, e renova em mim um espírito reto.
http://twitter.com/edson_alves_
Skype: edson.alvesan
http://www.vacabikers.wordpress.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Yahoo Messenger MSN Messenger
edsonalves
Colaborador
Colaborador


Registrado: Terça-Feira, 27 de Janeiro de 2009
Mensagens: 1938
Localização: Bauru - SP

MensagemEnviada: Qua Mai 31, 2017 10:30 pm    Assunto: Responder com Citação

Up Smile
_________________
Cria em mim, ó Deus, um coração puro, e renova em mim um espírito reto.
http://twitter.com/edson_alves_
Skype: edson.alvesan
http://www.vacabikers.wordpress.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Yahoo Messenger MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Qui Jun 01, 2017 9:34 am    Assunto: Responder com Citação

pelo que me parece o websocket possui um protocolo a ser respeitado:

Troca de Quadros de Dados
O cliente ou o servidor pode optar por enviar uma mensagem a qualquer momento - essa é a magia do WebSockets. No entanto, extrair informações desses chamados "quadros" de dados é uma experiência não tão mágica. Embora todos os quadros sigam o mesmo formato específico , os dados que vão do cliente para o servidor são mascarados usando criptografia XOR (com uma chave de 32 bits). A seção 5 da especificação descreve isso em detalhes.

Formato

Cada quadro de dados (do cliente para o servidor ou vice-versa) segue o mesmo formato:

Código:
Frame format: 
​​
      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-------+-+-------------+-------------------------------+
     |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
     |I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
     |N|V|V|V|       |S|             |   (if payload len==126/127)   |
     | |1|2|3|       |K|             |                               |
     +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
     |     Extended payload length continued, if payload len == 127  |
     + - - - - - - - - - - - - - - - +-------------------------------+
     |                               |Masking-key, if MASK set to 1  |
     +-------------------------------+-------------------------------+
     | Masking-key (continued)       |          Payload Data         |
     +-------------------------------- - - - - - - - - - - - - - - - +
     :                     Payload Data continued ...                :
     + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
     |                     Payload Data continued ...                |
     +---------------------------------------------------------------+


O bit MASK simplesmente diz se a mensagem está codificada. As mensagens do cliente devem ser mascaradas, então o servidor deve esperar que isso seja 1. (Na verdade, a seção 5.1 da especificação diz que o servidor deve desconectar de um cliente se esse cliente envia uma mensagem sem máscara). Ao enviar uma moldura de volta Para o cliente, não o mascarar e não definir o bit de máscara. Vamos explicar mascaramento mais tarde. Nota: Você deve mascarar as mensagens mesmo quando usar um soquete seguro. RSV1-3 pode ser ignorado, eles são para extensões.

O campo opcode define como interpretar os dados de carga útil: 0x0 para continuação, para texto (que é sempre codificado em UTF-8), para binário e outros chamados "códigos de controle" que serão discutidos mais tarde. Nesta versão do WebSockets, para e para não ter nenhum significado . 0x10x20x30x70xB0xF

O bit FIN diz se esta é a última mensagem de uma série. Se for 0, o servidor continuará ouvindo mais partes da mensagem; Caso contrário, o servidor deve considerar a mensagem entregue. Mais sobre isso mais tarde.

Decodificação Payload Length

Para ler os dados da carga útil, você deve saber quando parar de ler. É por isso que o comprimento da carga útil é importante saber. Infelizmente, isso é um pouco complicado. Para lê-lo, siga estas etapas:

Leia os bits 9-15 (inclusive) e interprete isso como um inteiro sem sinal. Se for 125 ou menos, então esse é o comprimento; Você está pronto . Se for 126, vá para a etapa 2. Se for 127, vá para a etapa 3.
Leia os próximos 16 bits e interprete esses como um inteiro sem sinal. Você terminou .
Leia os próximos 64 bits e interprete esses como um inteiro não assinado (O bit mais significativo DEVE ser 0). Você terminou .
Ler e desmascarar os dados

Se o bit MASK foi definido (e deve ser, para mensagens de cliente para servidor), ler os próximos 4 octetos (32 bits); Esta é a chave de máscara. Uma vez que o comprimento da carga útil e a tecla de máscara são decodificados, você pode seguir em frente e ler esse número de bytes do soquete. Vamos chamar os dados CODIFICADOS e a chave MASK . Para obter DECODED , faça um loop pelos octetos (bytes aka caracteres para dados de texto) de CODIFICADO e XOR o octeto com o octeto (i modulo 4) da MÁSCARA. Em pseudo-código (que acontece de ser válido em JavaScript):

Código:
var DECODED = "";
for (var i = 0; i < ENCODED.length; i++) {
    DECODED[i] = ENCODED[i] ^ MASK[i % 4];
}


informações extraída de:
https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers


Em todos os caso vou estar a tentar realizar testes cá e tão logo eu tenha algum resultado post em seguida.
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Qui Jun 01, 2017 9:50 am    Assunto: Responder com Citação

Seguindo a logica da decodificação da mensagem ficaria algo do tipo:

Código:
function decodificaDados(mask, dados:string):string;
begin
  result:=Dados;
  for i:=1 to length(result) do
    result[i]:=chr(ord(result[i]) xor ord(mask[i mod 4 + 1])); // + 1 string em delphi possui index inicial em 1.
end;

_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
edsonalves
Colaborador
Colaborador


Registrado: Terça-Feira, 27 de Janeiro de 2009
Mensagens: 1938
Localização: Bauru - SP

MensagemEnviada: Dom Jun 04, 2017 10:32 am    Assunto: Responder com Citação

strak2012 escreveu:
Seguindo a logica da decodificação da mensagem ficaria algo do tipo:

Código:
function decodificaDados(mask, dados:string):string;
begin
  result:=Dados;
  for i:=1 to length(result) do
    result[i]:=chr(ord(result[i]) xor ord(mask[i mod 4 + 1])); // + 1 string em delphi possui index inicial em 1.
end;


Amigo, até ai tranquilo, mas como decodificar uma mensagem que vc não recebe..rsrs a grande coisa ta ai.... Sad
_________________
Cria em mim, ó Deus, um coração puro, e renova em mim um espírito reto.
http://twitter.com/edson_alves_
Skype: edson.alvesan
http://www.vacabikers.wordpress.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Yahoo Messenger MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Seg Jun 05, 2017 2:42 am    Assunto: Responder com Citação

Fiz um pequeno exemplo da comunicação do Delphi e o socket.Io com o componente mencionado acima (Socket nativo do delphi):
Segue o link do exemplo compilado + fontes: download aqui

Visto também a forma pelo qual foi feito é possível implementar a comunicação entre o Delphi e Socket.Io no android por meio do IdTCPClient

Quando tiver mais tempo vou ver se posto outros exemplos com os dois componentes mencionados Socket Nativo e IdTCPClient

Não consegui resolver um pequeno problema neste exemplo que se trata da geração Sec-WebSocket-Key, mesmo não sabendo gerar o exemplo funciona bem, contudo ele acaba por criar duas sessões no servidor por conta disso.

Se alguém souber de mais informação e quiser partilhar sinta-se a vontade em deixar seus comentários.

Dos meus testes


Para já é isso
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Ir à página 1, 2  Próximo
Página 1 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB